From a491ef2093058c26e97e82027ccfec547ea0de29 Mon Sep 17 00:00:00 2001 From: John Doty Date: Thu, 22 Mar 2012 07:16:09 -0700 Subject: [PATCH] Initial commit --- .emacs.d/auto-save-list/.saves-10156-BIFROST~ | 4 + .../auto-save-list/.saves-10232-JOHNDOTY-1~ | 0 .../.saves-10324-JOHNDOTY-USBOX~ | 8 + .../.saves-1040-JOHNDOTY-USBOX~ | 20 + .../auto-save-list/.saves-10948-JOHNDOTY-1~ | 32 + .../.saves-11052-RECENTCONVERT~ | 16 + .../auto-save-list/.saves-11368-JOHNDOTY-1~ | 8 + .../auto-save-list/.saves-12124-JOHNDOTY-1~ | 6 + .../auto-save-list/.saves-12188-JOHNDOTY-1~ | 46 + .../auto-save-list/.saves-1284-GABRIEL-JD~ | 4 + .../auto-save-list/.saves-13692-JOHNDOTY-1~ | 64 + .../auto-save-list/.saves-152-JOHNDOTY-1~ | 2 + .../auto-save-list/.saves-15596-GABRIEL-JD~ | 2 + .../auto-save-list/.saves-172-JOHNDOTY-IDES~ | 2 + .../auto-save-list/.saves-18888-JOHNDOTY-1~ | 4 + .../auto-save-list/.saves-1952-JOHNDOTY-1~ | 20 + .emacs.d/auto-save-list/.saves-2044-BIFROST~ | 10 + .../auto-save-list/.saves-2312-GABRIEL-JD~ | 0 .../.saves-2396-JOHNDOTY-USBOX~ | 42 + .../.saves-2440-JOHNDOTY-USBOX~ | 14 + .../.saves-2668-JOHNDOTY-USBOX~ | 0 .../.saves-2704-JOHNDOTY-USBOX~ | 8 + .../auto-save-list/.saves-2824-GABRIEL-JD~ | 8 + .../.saves-2992-JOHNDOTY-USBOX~ | 2 + .../auto-save-list/.saves-3032-JOHNDOTY-1~ | 34 + .../.saves-3080-JOHNDOTY-USBOX~ | 2 + .../auto-save-list/.saves-31780-JOHNDOTY-1~ | 8 + .../auto-save-list/.saves-3328-GABRIEL-JD~ | 2 + .../.saves-3488-JOHNDOTY-USBOX~ | 2 + .emacs.d/auto-save-list/.saves-3536-BIFROST~ | 4 + .../auto-save-list/.saves-3540-JOHNDOTY-1~ | 2 + .../.saves-3540-JOHNDOTY-USBOX~ | 12 + .../.saves-3584-JOHNDOTY-USBOX~ | 16 + .../.saves-3724-JOHNDOTY-USBOX~ | 2 + .../.saves-3732-JOHNDOTY-USBOX~ | 2 + .../auto-save-list/.saves-3752-JOHNDOTY-1~ | 2 + .../.saves-3800-JOHNDOTY-USBOX~ | 22 + .../.saves-3808-JOHNDOTY-USBOX~ | 32 + .../auto-save-list/.saves-3920-JOHNDOTY-1~ | 2 + .../.saves-4036-JOHNDOTY-USBOX~ | 64 + .../auto-save-list/.saves-4076-GABRIEL-JD~ | 2 + .../.saves-4084-JOHNDOTY-USBOX~ | 0 .../.saves-4172-JOHNDOTY-USBOX~ | 40 + .../.saves-4184-JOHNDOTY-USBOX~ | 2 + .../auto-save-list/.saves-4276-JOHNDOTY-1~ | 26 + .../.saves-4284-JOHNDOTY-USBOX~ | 28 + .../.saves-4448-JOHNDOTY-USBOX~ | 12 + .../auto-save-list/.saves-4452-GABRIEL-JD~ | 4 + .../.saves-4504-JOHNDOTY-USBOX~ | 10 + .../.saves-4576-JOHNDOTY-USBOX~ | 36 + .../.saves-4608-JOHNDOTY-USBOX~ | 16 + .../auto-save-list/.saves-4628-JOHNDOTY-1~ | 2 + .emacs.d/auto-save-list/.saves-4708-BIFROST~ | 4 + .../auto-save-list/.saves-4728-JOHNDOTY-IDES~ | 10 + .../.saves-4728-JOHNDOTY-USBOX~ | 16 + .../.saves-4780-JOHNDOTY-USBOX~ | 2 + .emacs.d/auto-save-list/.saves-4936-BIFROST~ | 2 + .../auto-save-list/.saves-4944-GABRIEL-JD~ | 2 + .../.saves-4952-JOHNDOTY-USBOX~ | 172 + .../auto-save-list/.saves-5060-JOHNDOTY-1~ | 6 + .../.saves-5112-JOHNDOTY-USBOX~ | 30 + .../.saves-5120-JOHNDOTY-USBOX~ | 24 + .../.saves-5148-JOHNDOTY-USBOX~ | 52 + .../auto-save-list/.saves-5196-JOHNDOTY-IDES~ | 46 + .../.saves-5204-JOHNDOTY-USBOX~ | 58 + .../.saves-5264-JOHNDOTY-USBOX~ | 4 + .emacs.d/auto-save-list/.saves-5276-BIFROST~ | 2 + .../auto-save-list/.saves-5276-GABRIEL-JD~ | 2 + .../auto-save-list/.saves-5288-JOHNDOTY-1~ | 10 + .../.saves-5356-JOHNDOTY-USBOX~ | 18 + .../.saves-5444-JOHNDOTY-USBOX~ | 0 .emacs.d/auto-save-list/.saves-5464-BIFROST~ | 6 + .../.saves-5480-JOHNDOTY-USBOX~ | 12 + .../auto-save-list/.saves-5648-GABRIEL-JD~ | 2 + .../.saves-5672-JOHNDOTY-USBOX~ | 24 + .../.saves-5880-JOHNDOTY-USBOX~ | 18 + .../.saves-5908-JOHNDOTY-USBOX~ | 20 + .../.saves-5984-JOHNDOTY-USBOX~ | 56 + .../.saves-6004-JOHNDOTY-USBOX~ | 26 + .../auto-save-list/.saves-6024-JOHNDOTY-IDES~ | 4 + .../.saves-6120-JOHNDOTY-USBOX~ | 2 + .emacs.d/auto-save-list/.saves-6196-BIFROST~ | 4 + .emacs.d/auto-save-list/.saves-6272-BIFROST~ | 12 + .../auto-save-list/.saves-6412-JOHNDOTY-1~ | 2 + .../auto-save-list/.saves-6488-JOHNDOTY-1~ | 14 + .../auto-save-list/.saves-6508-JOHNDOTY-1~ | 2 + .../.saves-6596-JOHNDOTY-USBOX~ | 8 + .../auto-save-list/.saves-668-JOHNDOTY-USBOX~ | 18 + .../auto-save-list/.saves-6768-JOHNDOTY-1~ | 12 + .../auto-save-list/.saves-6808-JOHNDOTY-IDES~ | 2 + .../auto-save-list/.saves-6972-JOHNDOTY-1~ | 22 + .../auto-save-list/.saves-7048-JOHNDOTY-1~ | 54 + .../auto-save-list/.saves-7104-GABRIEL-JD~ | 2 + .emacs.d/auto-save-list/.saves-7248-BIFROST~ | 6 + .../auto-save-list/.saves-732-JOHNDOTY-USBOX~ | 0 .../.saves-7384-JOHNDOTY-USBOX~ | 0 .../auto-save-list/.saves-7440-JOHNDOTY-1~ | 8 + .../auto-save-list/.saves-748-JOHNDOTY-USBOX~ | 34 + .../.saves-7560-JOHNDOTY-USBOX~ | 2 + .../auto-save-list/.saves-7652-GABRIEL-JD~ | 2 + .../.saves-7656-JOHNDOTY-USBOX~ | 16 + .../auto-save-list/.saves-7712-GABRIEL-JD~ | 10 + .../auto-save-list/.saves-7788-JOHNDOTY-1~ | 14 + .../auto-save-list/.saves-7792-JOHNDOTY-1~ | 2 + .../auto-save-list/.saves-7912-GABRIEL-JD~ | 20 + .../auto-save-list/.saves-7944-JOHNDOTY1~ | 2 + .../auto-save-list/.saves-8124-JOHNDOTY-1~ | 22 + .../auto-save-list/.saves-8332-JOHNDOTY-1~ | 28 + .../auto-save-list/.saves-8360-JOHNDOTY-1~ | 0 .../auto-save-list/.saves-8396-JOHNDOTY-1~ | 2 + .../auto-save-list/.saves-8468-GABRIEL-JD~ | 4 + .../auto-save-list/.saves-8684-GABRIEL-JD~ | 0 .../auto-save-list/.saves-8732-JOHNDOTY-1~ | 2 + .emacs.d/auto-save-list/.saves-8888-BIFROST~ | 2 + .../auto-save-list/.saves-8900-JOHNDOTY-IDES~ | 14 + .../auto-save-list/.saves-904-JOHNDOTY-USBOX~ | 2 + .../auto-save-list/.saves-9212-JOHNDOTY-1~ | 60 + .../auto-save-list/.saves-9236-JOHNDOTY-1~ | 102 + .emacs.d/auto-save-list/.saves-9256-BIFROST~ | 2 + .../auto-save-list/.saves-9396-JOHNDOTY-IDES~ | 2 + .../.saves-9536-JOHNDOTY-USBOX~ | 10 + .../.saves-9668-JOHNDOTY-USBOX~ | 26 + .emacs.d/elpa/archive-contents | 447 + .emacs.d/elpa/builtin-packages | 16 + .emacs.d/elpa/package.el | 1507 ++ .emacs.d/init (JOHNDOTY-1).el | 484 + .emacs.d/init.el | 514 + .emacs.d/tramp | 6 + .gitconfig | 5 + .../Modules/PowerBoots/Add-BootsFunction.ps1 | 385 + .../Modules/PowerBoots/ContentProperties.ps1 | 77 + .../PowerBoots/DependencyProperties.clixml | Bin 0 -> 543048 bytes .../New-Microsoft.Win32.OpenFileDialog.ps1 | 271 + .../New-Microsoft.Win32.SaveFileDialog.ps1 | 265 + ...-System.Windows.Annotations.Annotation.ps1 | 193 + ...Windows.Annotations.AnnotationResource.ps1 | 175 + ...tem.Windows.Annotations.ContentLocator.ps1 | 163 + ...indows.Annotations.ContentLocatorGroup.ps1 | 163 + ...dPropertyBrowsableForChildrenAttribute.ps1 | 163 + ....Windows.ColorConvertedBitmapExtension.ps1 | 161 + ...ew-System.Windows.ComponentResourceKey.ps1 | 169 + .../New-System.Windows.Condition.ps1 | 181 + ...New-System.Windows.ConditionCollection.ps1 | 163 + ...New-System.Windows.Controls.AccessText.ps1 | 1075 ++ ...ows.Controls.AdornedElementPlaceholder.ps1 | 985 ++ ....Windows.Controls.AlternationConverter.ps1 | 161 + ....Controls.BooleanToVisibilityConverter.ps1 | 161 + .../New-System.Windows.Controls.Border.ps1 | 1015 ++ ...indows.Controls.BorderGapMaskConverter.ps1 | 161 + .../New-System.Windows.Controls.Button.ps1 | 1153 ++ .../New-System.Windows.Controls.Canvas.ps1 | 992 ++ .../New-System.Windows.Controls.CheckBox.ps1 | 1171 ++ ...stem.Windows.Controls.ColumnDefinition.ps1 | 817 ++ .../New-System.Windows.Controls.ComboBox.ps1 | 1262 ++ ...w-System.Windows.Controls.ComboBoxItem.ps1 | 1129 ++ ...System.Windows.Controls.ContentControl.ps1 | 1105 ++ ...stem.Windows.Controls.ContentPresenter.ps1 | 1015 ++ ...ew-System.Windows.Controls.ContextMenu.ps1 | 1226 ++ .../New-System.Windows.Controls.Control.ps1 | 1081 ++ ...ystem.Windows.Controls.ControlTemplate.ps1 | 181 + ...ndows.Controls.DataErrorValidationRule.ps1 | 169 + ....Windows.Controls.DataTemplateSelector.ps1 | 161 + .../New-System.Windows.Controls.Decorator.ps1 | 985 ++ .../New-System.Windows.Controls.DockPanel.ps1 | 998 ++ ...System.Windows.Controls.DocumentViewer.ps1 | 1141 ++ ...ndows.Controls.ExceptionValidationRule.ps1 | 169 + .../New-System.Windows.Controls.Expander.ps1 | 1153 ++ ...indows.Controls.FlowDocumentPageViewer.ps1 | 1123 ++ ...em.Windows.Controls.FlowDocumentReader.ps1 | 1147 ++ ...dows.Controls.FlowDocumentScrollViewer.ps1 | 1135 ++ .../New-System.Windows.Controls.Frame.ps1 | 1177 ++ .../New-System.Windows.Controls.Grid.ps1 | 1010 ++ ...w-System.Windows.Controls.GridSplitter.ps1 | 1141 ++ .../New-System.Windows.Controls.GridView.ps1 | 205 + ...System.Windows.Controls.GridViewColumn.ps1 | 217 + ...dows.Controls.GridViewColumnCollection.ps1 | 169 + ....Windows.Controls.GridViewColumnHeader.ps1 | 1141 ++ ...ws.Controls.GridViewHeaderRowPresenter.ps1 | 1027 ++ ....Windows.Controls.GridViewRowPresenter.ps1 | 991 ++ .../New-System.Windows.Controls.GroupBox.ps1 | 1129 ++ .../New-System.Windows.Controls.GroupItem.ps1 | 1105 ++ ...New-System.Windows.Controls.GroupStyle.ps1 | 205 + ...indows.Controls.HeaderedContentControl.ps1 | 1129 ++ ....Windows.Controls.HeaderedItemsControl.ps1 | 1184 ++ .../New-System.Windows.Controls.Image.ps1 | 1003 ++ .../New-System.Windows.Controls.InkCanvas.ps1 | 1136 ++ ...w-System.Windows.Controls.InkPresenter.ps1 | 991 ++ ...w-System.Windows.Controls.ItemsControl.ps1 | 1160 ++ ...em.Windows.Controls.ItemsPanelTemplate.ps1 | 169 + ...System.Windows.Controls.ItemsPresenter.ps1 | 979 ++ .../New-System.Windows.Controls.Label.ps1 | 1111 ++ .../New-System.Windows.Controls.ListBox.ps1 | 1202 ++ ...ew-System.Windows.Controls.ListBoxItem.ps1 | 1123 ++ .../New-System.Windows.Controls.ListView.ps1 | 1208 ++ ...w-System.Windows.Controls.ListViewItem.ps1 | 1123 ++ ...w-System.Windows.Controls.MediaElement.ps1 | 1087 ++ .../New-System.Windows.Controls.Menu.ps1 | 1166 ++ .../New-System.Windows.Controls.MenuItem.ps1 | 1286 ++ ...trols.MenuScrollingVisibilityConverter.ps1 | 161 + .../New-System.Windows.Controls.Page.ps1 | 1051 ++ ...ew-System.Windows.Controls.PasswordBox.ps1 | 1105 ++ ...ws.Controls.Primitives.BulletDecorator.ps1 | 997 ++ ...s.Controls.Primitives.DocumentPageView.ps1 | 1015 ++ ...stem.Windows.Controls.Primitives.Popup.ps1 | 1057 ++ ...ndows.Controls.Primitives.RepeatButton.ps1 | 1153 ++ ...Windows.Controls.Primitives.ResizeGrip.ps1 | 1081 ++ ....Windows.Controls.Primitives.ScrollBar.ps1 | 1135 ++ ....Windows.Controls.Primitives.StatusBar.ps1 | 1160 ++ ...dows.Controls.Primitives.StatusBarItem.ps1 | 1105 ++ ...m.Windows.Controls.Primitives.TabPanel.ps1 | 992 ++ ...stem.Windows.Controls.Primitives.Thumb.ps1 | 1105 ++ ...em.Windows.Controls.Primitives.TickBar.ps1 | 1045 ++ ...ndows.Controls.Primitives.ToggleButton.ps1 | 1171 ++ ...ntrols.Primitives.ToolBarOverflowPanel.ps1 | 998 ++ ...ndows.Controls.Primitives.ToolBarPanel.ps1 | 1016 ++ ...stem.Windows.Controls.Primitives.Track.ps1 | 1033 ++ ...indows.Controls.Primitives.UniformGrid.ps1 | 1010 ++ ...ew-System.Windows.Controls.PrintDialog.ps1 | 199 + ....Windows.Controls.PrintDialogException.ps1 | 169 + ...ew-System.Windows.Controls.ProgressBar.ps1 | 1129 ++ ...ew-System.Windows.Controls.RadioButton.ps1 | 1177 ++ ...ew-System.Windows.Controls.RichTextBox.ps1 | 1159 ++ ...-System.Windows.Controls.RowDefinition.ps1 | 817 ++ ...indows.Controls.ScrollContentPresenter.ps1 | 1039 ++ ...w-System.Windows.Controls.ScrollViewer.ps1 | 1159 ++ .../New-System.Windows.Controls.Separator.ps1 | 1081 ++ .../New-System.Windows.Controls.Slider.ps1 | 1201 ++ ...tem.Windows.Controls.SoundPlayerAction.ps1 | 163 + ...New-System.Windows.Controls.StackPanel.ps1 | 1016 ++ ...-System.Windows.Controls.StyleSelector.ps1 | 161 + ...New-System.Windows.Controls.TabControl.ps1 | 1244 ++ .../New-System.Windows.Controls.TabItem.ps1 | 1135 ++ .../New-System.Windows.Controls.TextBlock.ps1 | 1088 ++ .../New-System.Windows.Controls.TextBox.ps1 | 1213 ++ .../New-System.Windows.Controls.ToolBar.ps1 | 1202 ++ ...ew-System.Windows.Controls.ToolBarTray.ps1 | 1003 ++ .../New-System.Windows.Controls.ToolTip.ps1 | 1171 ++ .../New-System.Windows.Controls.TreeView.ps1 | 1172 ++ ...w-System.Windows.Controls.TreeViewItem.ps1 | 1220 ++ ...ew-System.Windows.Controls.UserControl.ps1 | 1105 ++ .../New-System.Windows.Controls.Viewbox.ps1 | 997 ++ ...New-System.Windows.Controls.Viewport3D.ps1 | 986 ++ ...indows.Controls.VirtualizingStackPanel.ps1 | 1016 ++ ...New-System.Windows.Controls.WebBrowser.ps1 | 1015 ++ .../New-System.Windows.Controls.WrapPanel.ps1 | 1010 ++ ...w-System.Windows.CornerRadiusConverter.ps1 | 161 + .../New-System.Windows.Data.Binding.ps1 | 301 + .../New-System.Windows.Data.BindingGroup.ps1 | 181 + ...ystem.Windows.Data.CollectionContainer.ps1 | 163 + ...stem.Windows.Data.CollectionViewSource.ps1 | 193 + ...ystem.Windows.Data.CompositeCollection.ps1 | 163 + .../New-System.Windows.Data.MultiBinding.ps1 | 259 + ...System.Windows.Data.ObjectDataProvider.ps1 | 193 + ...ew-System.Windows.Data.PriorityBinding.ps1 | 187 + ....Windows.Data.PropertyGroupDescription.ps1 | 181 + ...New-System.Windows.Data.RelativeSource.ps1 | 175 + ...Windows.Data.ValueUnavailableException.ps1 | 169 + ...ew-System.Windows.Data.XmlDataProvider.ps1 | 199 + ...ystem.Windows.Data.XmlNamespaceMapping.ps1 | 169 + ...ows.Data.XmlNamespaceMappingCollection.ps1 | 161 + .../New-System.Windows.DataTemplate.ps1 | 181 + .../New-System.Windows.DataTemplateKey.ps1 | 163 + .../New-System.Windows.DataTrigger.ps1 | 187 + ...w-System.Windows.DialogResultConverter.ps1 | 161 + ...tem.Windows.Documents.AdornerDecorator.ps1 | 985 ++ ...tem.Windows.Documents.BlockUIContainer.ps1 | 925 ++ .../New-System.Windows.Documents.Bold.ps1 | 866 ++ ...em.Windows.Documents.DocumentReference.ps1 | 985 ++ ...uments.DocumentStructures.BlockElement.ps1 | 161 + ...nts.DocumentStructures.FigureStructure.ps1 | 161 + ...s.DocumentStructures.ListItemStructure.ps1 | 163 + ...ments.DocumentStructures.ListStructure.ps1 | 161 + ...uments.DocumentStructures.NamedElement.ps1 | 163 + ....DocumentStructures.ParagraphStructure.ps1 | 161 + ...ts.DocumentStructures.SectionStructure.ps1 | 161 + ...ocuments.DocumentStructures.StoryBreak.ps1 | 161 + ...ments.DocumentStructures.StoryFragment.ps1 | 175 + ...ents.DocumentStructures.StoryFragments.ps1 | 161 + ....DocumentStructures.TableCellStructure.ps1 | 169 + ...umentStructures.TableRowGroupStructure.ps1 | 161 + ...s.DocumentStructures.TableRowStructure.ps1 | 161 + ...ents.DocumentStructures.TableStructure.ps1 | 161 + .../New-System.Windows.Documents.Figure.ps1 | 956 ++ ...System.Windows.Documents.FixedDocument.ps1 | 799 ++ ...indows.Documents.FixedDocumentSequence.ps1 | 799 ++ ...New-System.Windows.Documents.FixedPage.ps1 | 1004 ++ .../New-System.Windows.Documents.Floater.ps1 | 920 ++ ...-System.Windows.Documents.FlowDocument.ps1 | 950 ++ .../New-System.Windows.Documents.Glyphs.ps1 | 1051 ++ ...New-System.Windows.Documents.Hyperlink.ps1 | 908 ++ ...em.Windows.Documents.InlineUIContainer.ps1 | 871 ++ .../New-System.Windows.Documents.Italic.ps1 | 866 ++ ...New-System.Windows.Documents.LineBreak.ps1 | 865 ++ ...ew-System.Windows.Documents.LinkTarget.ps1 | 163 + ...Windows.Documents.LinkTargetCollection.ps1 | 169 + .../New-System.Windows.Documents.List.ps1 | 943 ++ .../New-System.Windows.Documents.ListItem.ps1 | 896 ++ ...w-System.Windows.Documents.PageContent.ps1 | 997 ++ ...New-System.Windows.Documents.Paragraph.ps1 | 956 ++ .../New-System.Windows.Documents.Run.ps1 | 871 ++ .../New-System.Windows.Documents.Section.ps1 | 926 ++ .../New-System.Windows.Documents.Span.ps1 | 866 ++ .../New-System.Windows.Documents.Table.ps1 | 937 ++ ...New-System.Windows.Documents.TableCell.ps1 | 896 ++ ...w-System.Windows.Documents.TableColumn.ps1 | 805 ++ .../New-System.Windows.Documents.TableRow.ps1 | 847 ++ ...System.Windows.Documents.TableRowGroup.ps1 | 847 ++ ...ts.TextElementEditingBehaviorAttribute.ps1 | 169 + ...New-System.Windows.Documents.Underline.ps1 | 866 ++ ...dows.Documents.ZoomPercentageConverter.ps1 | 161 + ...ystem.Windows.DynamicResourceExtension.ps1 | 163 + ...dows.DynamicResourceExtensionConverter.ps1 | 161 + .../New-System.Windows.EventSetter.ps1 | 175 + .../New-System.Windows.EventTrigger.ps1 | 187 + ...w-System.Windows.FigureLengthConverter.ps1 | 161 + .../New-System.Windows.FontSizeConverter.ps1 | 161 + ...System.Windows.FrameworkContentElement.ps1 | 793 + .../New-System.Windows.FrameworkElement.ps1 | 979 ++ ...System.Windows.FrameworkElementFactory.ps1 | 175 + ...stem.Windows.FrameworkPropertyMetadata.ps1 | 253 + ...New-System.Windows.GridLengthConverter.ps1 | 161 + ...ystem.Windows.HierarchicalDataTemplate.ps1 | 229 + ...-System.Windows.Input.CommandConverter.ps1 | 161 + .../New-System.Windows.Interop.DocObjHost.ps1 | 161 + .../New-System.Windows.LengthConverter.ps1 | 161 + ...w-System.Windows.Markup.ArrayExtension.ps1 | 163 + ...s.Markup.ComponentResourceKeyConverter.ps1 | 161 + ...ows.Markup.DependencyPropertyConverter.ps1 | 161 + ...rkup.Localizer.BamlLocalizableResource.ps1 | 187 + ...p.Localizer.BamlLocalizationDictionary.ps1 | 163 + ...Markup.Localizer.ElementLocalizability.ps1 | 169 + ...ystem.Windows.Markup.NamespaceMapEntry.ps1 | 175 + ...ew-System.Windows.Markup.NullExtension.ps1 | 161 + ...ew-System.Windows.Markup.ParserContext.ps1 | 181 + ...p.ResourceReferenceExpressionConverter.ps1 | 161 + ...em.Windows.Markup.RoutedEventConverter.ps1 | 161 + ...-System.Windows.Markup.StaticExtension.ps1 | 163 + ...em.Windows.Markup.TemplateKeyConverter.ps1 | 161 + ...ew-System.Windows.Markup.TypeExtension.ps1 | 169 + ...stem.Windows.Markup.XamlParseException.ps1 | 193 + .../New-System.Windows.Markup.XamlReader.ps1 | 163 + ...indows.Media.Animation.BeginStoryboard.ps1 | 175 + ...ia.Animation.DiscreteThicknessKeyFrame.ps1 | 175 + ...edia.Animation.LinearThicknessKeyFrame.ps1 | 175 + ...indows.Media.Animation.PauseStoryboard.ps1 | 163 + ...ndows.Media.Animation.RemoveStoryboard.ps1 | 163 + ...ndows.Media.Animation.ResumeStoryboard.ps1 | 163 + ...Windows.Media.Animation.SeekStoryboard.ps1 | 175 + ...edia.Animation.SetStoryboardSpeedRatio.ps1 | 169 + ...s.Media.Animation.SkipStoryboardToFill.ps1 | 163 + ...edia.Animation.SplineThicknessKeyFrame.ps1 | 181 + ...Windows.Media.Animation.StopStoryboard.ps1 | 163 + ...tem.Windows.Media.Animation.Storyboard.ps1 | 254 + ...ows.Media.Animation.ThicknessAnimation.ps1 | 277 + ...ation.ThicknessAnimationUsingKeyFrames.ps1 | 265 + ....Animation.ThicknessKeyFrameCollection.ps1 | 169 + ...indows.Media.Effects.BevelBitmapEffect.ps1 | 193 + ...indows.Media.Effects.BitmapEffectGroup.ps1 | 164 + ...Windows.Media.Effects.BlurBitmapEffect.ps1 | 175 + ...s.Media.Effects.DropShadowBitmapEffect.ps1 | 199 + ...ndows.Media.Effects.EmbossBitmapEffect.ps1 | 175 + ...ws.Media.Effects.OuterGlowBitmapEffect.ps1 | 187 + .../New-System.Windows.Media.GradientStop.ps1 | 175 + .../New-System.Windows.Media.ImageBrush.ps1 | 235 + .../New-System.Windows.Media.ImageDrawing.ps1 | 175 + ...stem.Windows.Media.LinearGradientBrush.ps1 | 212 + ...w-System.Windows.Media.MatrixTransform.ps1 | 169 + .../New-System.Windows.Media.MediaPlayer.ps1 | 241 + ...stem.Windows.Media.RadialGradientBrush.ps1 | 224 + ...w-System.Windows.Media.RotateTransform.ps1 | 181 + ...ew-System.Windows.Media.ScaleTransform.ps1 | 187 + ...New-System.Windows.Media.SkewTransform.ps1 | 187 + ...ew-System.Windows.Media.TransformGroup.ps1 | 164 + ...ystem.Windows.Media.TranslateTransform.ps1 | 175 + .../New-System.Windows.Media.VideoDrawing.ps1 | 175 + .../New-System.Windows.Media.VisualBrush.ps1 | 241 + .../New-System.Windows.MultiDataTrigger.ps1 | 181 + .../New-System.Windows.MultiTrigger.ps1 | 181 + .../New-System.Windows.NameScope.ps1 | 161 + ...s.Navigation.JournalEntryListConverter.ps1 | 161 + ...ation.JournalEntryUnifiedViewConverter.ps1 | 161 + ...em.Windows.Navigation.NavigationWindow.ps1 | 1303 ++ ...w-System.Windows.NullableBoolConverter.ps1 | 161 + ...w-System.Windows.PropertyPathConverter.ps1 | 161 + .../New-System.Windows.ResourceDictionary.ps1 | 181 + ....ResourceReferenceKeyNotFoundException.ps1 | 169 + ...-System.Windows.Resources.ContentTypes.ps1 | 161 + ...m.Windows.Resources.StreamResourceInfo.ps1 | 161 + .../Functions/New-System.Windows.Setter.ps1 | 175 + ...ew-System.Windows.SetterBaseCollection.ps1 | 163 + .../New-System.Windows.Shapes.Ellipse.ps1 | 1045 ++ .../New-System.Windows.Shapes.Line.ps1 | 1069 ++ .../New-System.Windows.Shapes.Path.ps1 | 1051 ++ .../New-System.Windows.Shapes.Polygon.ps1 | 1057 ++ .../New-System.Windows.Shapes.Polyline.ps1 | 1057 ++ .../New-System.Windows.Shapes.Rectangle.ps1 | 1057 ++ ...System.Windows.StaticResourceExtension.ps1 | 163 + .../Functions/New-System.Windows.Style.ps1 | 187 + ...em.Windows.StyleTypedPropertyAttribute.ps1 | 169 + ...ows.TemplateBindingExpressionConverter.ps1 | 161 + ...ystem.Windows.TemplateBindingExtension.ps1 | 175 + ...dows.TemplateBindingExtensionConverter.ps1 | 161 + ...w-System.Windows.TemplatePartAttribute.ps1 | 169 + ...ystem.Windows.ThemeDictionaryExtension.ps1 | 163 + .../New-System.Windows.ThicknessConverter.ps1 | 161 + .../Functions/New-System.Windows.Trigger.ps1 | 193 + ...System.Windows.TriggerActionCollection.ps1 | 163 + .../Functions/New-System.Windows.Window.ps1 | 1243 ++ .../New-System.Windows.WindowCollection.ps1 | 161 + .../Modules/PowerBoots/New-BootsImage.ps1 | 148 + .../Modules/PowerBoots/Out-BootsWindow.ps1 | 677 + .../Modules/PowerBoots/PoshWpf.dll | Bin 0 -> 111896 bytes .../Modules/PowerBoots/PoshWpf.psd1 | Bin 0 -> 8998 bytes .../Modules/PowerBoots/PowerBoots.psd1 | Bin 0 -> 9362 bytes .../Modules/PowerBoots/PowerBoots.psm1 | Bin 0 -> 17440 bytes .../Modules/PowerBoots/Reset-DefaultBoots.ps1 | 339 + .../Modules/PowerBoots/Samples/Clock.xaml | 101 + .../Modules/PowerBoots/Samples/Samples.ps1 | 567 + .../Select-GraphicalFilteredObject.ps1 | Bin 0 -> 15104 bytes .../PowerBoots/Set-DependencyProperty.ps1 | 171 + .../Modules/PowerBoots/UtilityFunctions.ps1 | 143 + .../Modules/PowerBoots/WpfTypes.format.ps1xml | 117 + .../Modules/PowerBoots/WpfTypes.types.ps1xml | 73 + .../XamlTemplates/DavesGlossyLight.xaml | 1198 ++ .../PowerBoots/XamlTemplates/default.xaml | 80 + .../XamlTemplates/huddledcontrols.xaml | 23 + .../Modules/VSProject/VSProject.ps1 | 31 + WindowsPowershell/Profile.ps1 | 141 + WindowsPowershell/a.out | Bin 0 -> 288 bytes site-lisp/ChangeLog | 665 + site-lisp/INSTALL | 181 + site-lisp/Makefile | 58 + site-lisp/Makefile.in | 58 + site-lisp/cc-mode/5.31.2/COPYING | 340 + site-lisp/cc-mode/5.31.2/MANIFEST | 42 + site-lisp/cc-mode/5.31.2/NEWS | 1062 ++ site-lisp/cc-mode/5.31.2/README | 123 + site-lisp/cc-mode/5.31.2/cc-align.el | 1272 ++ site-lisp/cc-mode/5.31.2/cc-align.elc | Bin 0 -> 34251 bytes site-lisp/cc-mode/5.31.2/cc-awk.el | 1014 ++ site-lisp/cc-mode/5.31.2/cc-awk.elc | Bin 0 -> 16879 bytes site-lisp/cc-mode/5.31.2/cc-bytecomp.el | 440 + site-lisp/cc-mode/5.31.2/cc-bytecomp.elc | Bin 0 -> 10630 bytes site-lisp/cc-mode/5.31.2/cc-cmds.el | 4235 ++++++ site-lisp/cc-mode/5.31.2/cc-cmds.elc | Bin 0 -> 87482 bytes site-lisp/cc-mode/5.31.2/cc-compat.el | 166 + site-lisp/cc-mode/5.31.2/cc-compat.elc | Bin 0 -> 3059 bytes site-lisp/cc-mode/5.31.2/cc-defs.el | 2035 +++ site-lisp/cc-mode/5.31.2/cc-defs.elc | Bin 0 -> 44220 bytes site-lisp/cc-mode/5.31.2/cc-engine.el | 8943 ++++++++++++ site-lisp/cc-mode/5.31.2/cc-engine.elc | Bin 0 -> 138163 bytes site-lisp/cc-mode/5.31.2/cc-fix.el | 141 + site-lisp/cc-mode/5.31.2/cc-fix.elc | Bin 0 -> 2936 bytes site-lisp/cc-mode/5.31.2/cc-fonts.el | 2368 +++ site-lisp/cc-mode/5.31.2/cc-fonts.elc | Bin 0 -> 137028 bytes site-lisp/cc-mode/5.31.2/cc-guess.el | 219 + site-lisp/cc-mode/5.31.2/cc-guess.elc | Bin 0 -> 4544 bytes site-lisp/cc-mode/5.31.2/cc-langs.el | 2905 ++++ site-lisp/cc-mode/5.31.2/cc-langs.elc | Bin 0 -> 69341 bytes site-lisp/cc-mode/5.31.2/cc-lobotomy.el | 160 + site-lisp/cc-mode/5.31.2/cc-lobotomy.elc | Bin 0 -> 3600 bytes site-lisp/cc-mode/5.31.2/cc-menus.el | 425 + site-lisp/cc-mode/5.31.2/cc-menus.elc | Bin 0 -> 7506 bytes site-lisp/cc-mode/5.31.2/cc-mode.el | 1248 ++ site-lisp/cc-mode/5.31.2/cc-mode.elc | Bin 0 -> 132885 bytes site-lisp/cc-mode/5.31.2/cc-mode.texi | 6935 +++++++++ site-lisp/cc-mode/5.31.2/cc-styles.el | 647 + site-lisp/cc-mode/5.31.2/cc-styles.elc | Bin 0 -> 16077 bytes site-lisp/cc-mode/5.31.2/cc-subword.el | 312 + site-lisp/cc-mode/5.31.2/cc-subword.elc | Bin 0 -> 7401 bytes site-lisp/cc-mode/5.31.2/cc-vars.el | 1637 +++ site-lisp/cc-mode/5.31.2/cc-vars.elc | Bin 0 -> 75794 bytes site-lisp/cc-mode/5.31.2/csharp-mode-0.5.0.el | 400 + site-lisp/cc-mode/5.31.2/elc/cc-align.elc | Bin 0 -> 34219 bytes site-lisp/cc-mode/5.31.2/elc/cc-awk.elc | Bin 0 -> 16882 bytes site-lisp/cc-mode/5.31.2/elc/cc-bytecomp.elc | Bin 0 -> 10633 bytes site-lisp/cc-mode/5.31.2/elc/cc-cmds.elc | Bin 0 -> 87893 bytes site-lisp/cc-mode/5.31.2/elc/cc-compat.elc | Bin 0 -> 3056 bytes site-lisp/cc-mode/5.31.2/elc/cc-defs.elc | Bin 0 -> 44223 bytes site-lisp/cc-mode/5.31.2/elc/cc-engine.elc | Bin 0 -> 138074 bytes site-lisp/cc-mode/5.31.2/elc/cc-fix.elc | Bin 0 -> 2939 bytes site-lisp/cc-mode/5.31.2/elc/cc-fonts.elc | Bin 0 -> 137031 bytes site-lisp/cc-mode/5.31.2/elc/cc-guess.elc | Bin 0 -> 4547 bytes site-lisp/cc-mode/5.31.2/elc/cc-langs.elc | Bin 0 -> 69344 bytes site-lisp/cc-mode/5.31.2/elc/cc-lobotomy.elc | Bin 0 -> 3603 bytes site-lisp/cc-mode/5.31.2/elc/cc-menus.elc | Bin 0 -> 7655 bytes site-lisp/cc-mode/5.31.2/elc/cc-mode.elc | Bin 0 -> 132888 bytes site-lisp/cc-mode/5.31.2/elc/cc-styles.elc | Bin 0 -> 16080 bytes site-lisp/cc-mode/5.31.2/elc/cc-subword.elc | Bin 0 -> 7404 bytes site-lisp/cc-mode/5.31.2/elc/cc-vars.elc | Bin 0 -> 75797 bytes .../cc-mode/5.31.2/elc/csharp-mode-0.5.0.elc | Bin 0 -> 39449 bytes site-lisp/cc-mode/5.31.3/COPYING | 340 + site-lisp/cc-mode/5.31.3/MANIFEST | 42 + site-lisp/cc-mode/5.31.3/NEWS | 1065 ++ site-lisp/cc-mode/5.31.3/README | 123 + site-lisp/cc-mode/5.31.3/cc-align.el | 1273 ++ site-lisp/cc-mode/5.31.3/cc-align.elc | Bin 0 -> 34251 bytes site-lisp/cc-mode/5.31.3/cc-awk.el | 1015 ++ site-lisp/cc-mode/5.31.3/cc-awk.elc | Bin 0 -> 16975 bytes site-lisp/cc-mode/5.31.3/cc-bytecomp.el | 440 + site-lisp/cc-mode/5.31.3/cc-bytecomp.elc | Bin 0 -> 10630 bytes site-lisp/cc-mode/5.31.3/cc-cmds.el | 4237 ++++++ site-lisp/cc-mode/5.31.3/cc-cmds.elc | Bin 0 -> 87582 bytes site-lisp/cc-mode/5.31.3/cc-compat.el | 166 + site-lisp/cc-mode/5.31.3/cc-compat.elc | Bin 0 -> 3059 bytes site-lisp/cc-mode/5.31.3/cc-defs.el | 2040 +++ site-lisp/cc-mode/5.31.3/cc-defs.elc | Bin 0 -> 44227 bytes site-lisp/cc-mode/5.31.3/cc-engine.el | 8943 ++++++++++++ site-lisp/cc-mode/5.31.3/cc-engine.elc | Bin 0 -> 138163 bytes site-lisp/cc-mode/5.31.3/cc-fix.el | 143 + site-lisp/cc-mode/5.31.3/cc-fix.elc | Bin 0 -> 2961 bytes site-lisp/cc-mode/5.31.3/cc-fonts.el | 2368 +++ site-lisp/cc-mode/5.31.3/cc-fonts.elc | Bin 0 -> 137028 bytes site-lisp/cc-mode/5.31.3/cc-guess.el | 219 + site-lisp/cc-mode/5.31.3/cc-guess.elc | Bin 0 -> 4544 bytes site-lisp/cc-mode/5.31.3/cc-langs.el | 2905 ++++ site-lisp/cc-mode/5.31.3/cc-langs.elc | Bin 0 -> 69341 bytes site-lisp/cc-mode/5.31.3/cc-lobotomy.el | 161 + site-lisp/cc-mode/5.31.3/cc-lobotomy.elc | Bin 0 -> 3600 bytes site-lisp/cc-mode/5.31.3/cc-menus.el | 425 + site-lisp/cc-mode/5.31.3/cc-menus.elc | Bin 0 -> 7506 bytes site-lisp/cc-mode/5.31.3/cc-mode.el | 1305 ++ site-lisp/cc-mode/5.31.3/cc-mode.elc | Bin 0 -> 133802 bytes site-lisp/cc-mode/5.31.3/cc-mode.texi | 6937 +++++++++ site-lisp/cc-mode/5.31.3/cc-styles.el | 647 + site-lisp/cc-mode/5.31.3/cc-styles.elc | Bin 0 -> 16077 bytes site-lisp/cc-mode/5.31.3/cc-subword.el | 312 + site-lisp/cc-mode/5.31.3/cc-subword.elc | Bin 0 -> 7401 bytes site-lisp/cc-mode/5.31.3/cc-vars.el | 1637 +++ site-lisp/cc-mode/5.31.3/cc-vars.elc | Bin 0 -> 75794 bytes site-lisp/cc-mode/5.31.3/csharp-mode-0.5.0.el | 400 + .../cc-mode/5.31.3/csharp-mode-0.5.0.elc | Bin 0 -> 41444 bytes site-lisp/cc-mode/5.31.3/csharp-mode-0.6.0.el | 454 + .../cc-mode/5.31.3/csharp-mode-0.6.0.elc | Bin 0 -> 43020 bytes .../cc-mode/csharp-only/csharp-mode-0.5.0.el | 400 + .../cc-mode/csharp-only/csharp-mode-0.6.0.el | 454 + site-lisp/cc-mode/readme.txt | 1 + .../cc-mode/zbrad-integrated/cc-align.el | 727 + .../cc-mode/zbrad-integrated/cc-align.elc | Bin 0 -> 19575 bytes .../cc-mode/zbrad-integrated/cc-bytecomp.el | 296 + .../cc-mode/zbrad-integrated/cc-bytecomp.elc | Bin 0 -> 8019 bytes site-lisp/cc-mode/zbrad-integrated/cc-cmds.el | 2574 ++++ .../cc-mode/zbrad-integrated/cc-cmds.elc | Bin 0 -> 54015 bytes .../cc-mode/zbrad-integrated/cc-compat.el | 164 + .../cc-mode/zbrad-integrated/cc-compat.elc | Bin 0 -> 3036 bytes site-lisp/cc-mode/zbrad-integrated/cc-defs.el | 354 + .../cc-mode/zbrad-integrated/cc-defs.elc | Bin 0 -> 6964 bytes .../cc-mode/zbrad-integrated/cc-engine.el | 2804 ++++ .../cc-mode/zbrad-integrated/cc-engine.elc | Bin 0 -> 49983 bytes .../cc-mode/zbrad-integrated/cc-langs.el | 682 + .../cc-mode/zbrad-integrated/cc-langs.elc | Bin 0 -> 15394 bytes .../cc-mode/zbrad-integrated/cc-menus.el | 457 + .../cc-mode/zbrad-integrated/cc-menus.elc | Bin 0 -> 8015 bytes site-lisp/cc-mode/zbrad-integrated/cc-mode.el | 985 ++ .../cc-mode/zbrad-integrated/cc-mode.elc | Bin 0 -> 25730 bytes .../cc-mode/zbrad-integrated/cc-styles.el | 529 + .../cc-mode/zbrad-integrated/cc-styles.elc | Bin 0 -> 13593 bytes site-lisp/cc-mode/zbrad-integrated/cc-vars.el | 1124 ++ .../cc-mode/zbrad-integrated/cc-vars.elc | Bin 0 -> 50668 bytes site-lisp/ci.el | 521 + site-lisp/ci.elc | Bin 0 -> 14455 bytes site-lisp/configure | 1018 ++ site-lisp/configure.in | 21 + site-lisp/doctest-mode.el | 919 ++ site-lisp/filladapt.el | 981 ++ site-lisp/filladapt.elc | Bin 0 -> 23849 bytes site-lisp/font-lock.el | 3245 +++++ site-lisp/font-lock.elc | Bin 0 -> 83266 bytes site-lisp/haml-mode.el | 649 + site-lisp/html-helper-mode.el | 2178 +++ site-lisp/install-sh | 238 + site-lisp/iso88591.map | 249 + site-lisp/javascript-mode.el | 356 + site-lisp/javascript-mode.elc | Bin 0 -> 6700 bytes site-lisp/js2 (JOHNDOTY-1).el | 11294 +++++++++++++++ site-lisp/js2 (JOHNDOTY-1).elc | Bin 0 -> 1484749 bytes site-lisp/js2.el | 11927 ++++++++++++++++ site-lisp/js2.elc | Bin 0 -> 1581510 bytes site-lisp/lua-mode.el | 1458 ++ site-lisp/lua-mode.elc | Bin 0 -> 41043 bytes site-lisp/m-mode.el | 114 + site-lisp/mkinstalldirs | 32 + site-lisp/mode-motion.el | 129 + site-lisp/msbuild.el | 3 + site-lisp/nxml-mode-20041004/COPYING | 340 + site-lisp/nxml-mode-20041004/Makefile | 80 + site-lisp/nxml-mode-20041004/NEWS | 199 + site-lisp/nxml-mode-20041004/README | 106 + site-lisp/nxml-mode-20041004/TODO | 468 + site-lisp/nxml-mode-20041004/VERSION | 1 + .../char-name/unicode/00000-0007F.el | 97 + .../char-name/unicode/00080-000FF.el | 98 + .../char-name/unicode/00100-0017F.el | 130 + .../char-name/unicode/00180-0024F.el | 181 + .../char-name/unicode/00250-002AF.el | 96 + .../char-name/unicode/002B0-002FF.el | 65 + .../char-name/unicode/00300-0036F.el | 98 + .../char-name/unicode/00370-003FF.el | 117 + .../char-name/unicode/00400-004FF.el | 248 + .../char-name/unicode/00500-0052F.el | 18 + .../char-name/unicode/00530-0058F.el | 88 + .../char-name/unicode/00590-005FF.el | 84 + .../char-name/unicode/00600-006FF.el | 210 + .../char-name/unicode/00700-0074F.el | 73 + .../char-name/unicode/00780-007BF.el | 52 + .../char-name/unicode/00900-0097F.el | 106 + .../char-name/unicode/00980-009FF.el | 91 + .../char-name/unicode/00A00-00A7F.el | 77 + .../char-name/unicode/00A80-00AFF.el | 80 + .../char-name/unicode/00B00-00B7F.el | 81 + .../char-name/unicode/00B80-00BFF.el | 63 + .../char-name/unicode/00C00-00C7F.el | 82 + .../char-name/unicode/00C80-00CFF.el | 82 + .../char-name/unicode/00D00-00D7F.el | 80 + .../char-name/unicode/00D80-00DFF.el | 82 + .../char-name/unicode/00E00-00E7F.el | 89 + .../char-name/unicode/00E80-00EFF.el | 67 + .../char-name/unicode/00F00-00FFF.el | 195 + .../char-name/unicode/01000-0109F.el | 80 + .../char-name/unicode/010A0-010FF.el | 82 + .../char-name/unicode/01100-011FF.el | 242 + .../char-name/unicode/01200-0137F.el | 347 + .../char-name/unicode/013A0-013FF.el | 87 + .../char-name/unicode/01400-0167F.el | 632 + .../char-name/unicode/01680-0169F.el | 31 + .../char-name/unicode/016A0-016FF.el | 83 + .../char-name/unicode/01700-0171F.el | 22 + .../char-name/unicode/01720-0173F.el | 25 + .../char-name/unicode/01740-0175F.el | 22 + .../char-name/unicode/01760-0177F.el | 20 + .../char-name/unicode/01780-017FF.el | 105 + .../char-name/unicode/01800-018AF.el | 157 + .../char-name/unicode/01E00-01EFF.el | 248 + .../char-name/unicode/01F00-01FFF.el | 235 + .../char-name/unicode/02000-0206F.el | 97 + .../char-name/unicode/02070-0209F.el | 31 + .../char-name/unicode/020A0-020CF.el | 20 + .../char-name/unicode/020D0-020FF.el | 29 + .../char-name/unicode/02100-0214F.el | 76 + .../char-name/unicode/02150-0218F.el | 51 + .../char-name/unicode/02190-021FF.el | 114 + .../char-name/unicode/02200-022FF.el | 258 + .../char-name/unicode/02300-023FF.el | 209 + .../char-name/unicode/02400-0243F.el | 41 + .../char-name/unicode/02440-0245F.el | 13 + .../char-name/unicode/02460-024FF.el | 161 + .../char-name/unicode/02500-0257F.el | 130 + .../char-name/unicode/02580-0259F.el | 34 + .../char-name/unicode/025A0-025FF.el | 98 + .../char-name/unicode/02600-026FF.el | 135 + .../char-name/unicode/02700-027BF.el | 176 + .../char-name/unicode/027C0-027EF.el | 30 + .../char-name/unicode/027F0-027FF.el | 18 + .../char-name/unicode/02800-028FF.el | 258 + .../char-name/unicode/02900-0297F.el | 130 + .../char-name/unicode/02980-029FF.el | 130 + .../char-name/unicode/02A00-02AFF.el | 258 + .../char-name/unicode/02E80-02EFF.el | 117 + .../char-name/unicode/02F00-02FDF.el | 216 + .../char-name/unicode/02FF0-02FFF.el | 14 + .../char-name/unicode/03000-0303F.el | 66 + .../char-name/unicode/03040-0309F.el | 95 + .../char-name/unicode/030A0-030FF.el | 98 + .../char-name/unicode/03100-0312F.el | 42 + .../char-name/unicode/03130-0318F.el | 96 + .../char-name/unicode/03190-0319F.el | 18 + .../char-name/unicode/031A0-031BF.el | 26 + .../char-name/unicode/031F0-031FF.el | 18 + .../char-name/unicode/03200-032FF.el | 234 + .../char-name/unicode/03300-033FF.el | 251 + .../char-name/unicode/03400-04DBF.el | 2 + .../char-name/unicode/0A000-0A48F.el | 1167 ++ .../char-name/unicode/0A490-0A4CF.el | 57 + .../char-name/unicode/0FB00-0FB4F.el | 60 + .../char-name/unicode/0FB50-0FDFF.el | 596 + .../char-name/unicode/0FE00-0FE0F.el | 18 + .../char-name/unicode/0FE20-0FE2F.el | 6 + .../char-name/unicode/0FE30-0FE4F.el | 32 + .../char-name/unicode/0FE50-0FE6F.el | 28 + .../char-name/unicode/0FE70-0FEFF.el | 143 + .../char-name/unicode/0FF00-0FFEF.el | 227 + .../char-name/unicode/0FFF0-0FFFF.el | 7 + .../char-name/unicode/10300-1032F.el | 37 + .../char-name/unicode/10330-1034F.el | 29 + .../char-name/unicode/10400-1044F.el | 78 + .../char-name/unicode/1D000-1D0FF.el | 248 + .../char-name/unicode/1D100-1D1FF.el | 221 + .../char-name/unicode/1D400-1D7FF.el | 993 ++ .../char-name/unicode/E0000-E007F.el | 99 + site-lisp/nxml-mode-20041004/dir | 18 + site-lisp/nxml-mode-20041004/nxml-enc.el | 167 + site-lisp/nxml-mode-20041004/nxml-enc.elc | Bin 0 -> 4028 bytes site-lisp/nxml-mode-20041004/nxml-glyph.el | 418 + site-lisp/nxml-mode-20041004/nxml-glyph.elc | Bin 0 -> 7847 bytes site-lisp/nxml-mode-20041004/nxml-maint.el | 106 + site-lisp/nxml-mode-20041004/nxml-maint.elc | Bin 0 -> 2303 bytes site-lisp/nxml-mode-20041004/nxml-mode.el | 2665 ++++ site-lisp/nxml-mode-20041004/nxml-mode.elc | Bin 0 -> 72799 bytes site-lisp/nxml-mode-20041004/nxml-mode.info | 745 + site-lisp/nxml-mode-20041004/nxml-mode.rnc | 20 + site-lisp/nxml-mode-20041004/nxml-mode.texi | 834 ++ site-lisp/nxml-mode-20041004/nxml-mode.xml | 852 ++ site-lisp/nxml-mode-20041004/nxml-ns.el | 148 + site-lisp/nxml-mode-20041004/nxml-ns.elc | Bin 0 -> 4283 bytes site-lisp/nxml-mode-20041004/nxml-outln.el | 1040 ++ site-lisp/nxml-mode-20041004/nxml-outln.elc | Bin 0 -> 27948 bytes site-lisp/nxml-mode-20041004/nxml-parse.el | 320 + site-lisp/nxml-mode-20041004/nxml-parse.elc | Bin 0 -> 8939 bytes site-lisp/nxml-mode-20041004/nxml-rap.el | 467 + site-lisp/nxml-mode-20041004/nxml-rap.elc | Bin 0 -> 10960 bytes site-lisp/nxml-mode-20041004/nxml-uchnm.el | 257 + site-lisp/nxml-mode-20041004/nxml-uchnm.elc | Bin 0 -> 7046 bytes site-lisp/nxml-mode-20041004/nxml-util.el | 100 + site-lisp/nxml-mode-20041004/nxml-util.elc | Bin 0 -> 3075 bytes site-lisp/nxml-mode-20041004/rng-auto.el | 278 + site-lisp/nxml-mode-20041004/rng-cmpct.el | 937 ++ site-lisp/nxml-mode-20041004/rng-cmpct.elc | Bin 0 -> 26494 bytes site-lisp/nxml-mode-20041004/rng-dt.el | 64 + site-lisp/nxml-mode-20041004/rng-dt.elc | Bin 0 -> 1986 bytes site-lisp/nxml-mode-20041004/rng-loc.el | 548 + site-lisp/nxml-mode-20041004/rng-loc.elc | Bin 0 -> 14736 bytes site-lisp/nxml-mode-20041004/rng-maint.el | 343 + site-lisp/nxml-mode-20041004/rng-maint.elc | Bin 0 -> 7410 bytes site-lisp/nxml-mode-20041004/rng-match.el | 1739 +++ site-lisp/nxml-mode-20041004/rng-match.elc | Bin 0 -> 47818 bytes site-lisp/nxml-mode-20041004/rng-nxml.el | 591 + site-lisp/nxml-mode-20041004/rng-nxml.elc | Bin 0 -> 14557 bytes site-lisp/nxml-mode-20041004/rng-parse.el | 104 + site-lisp/nxml-mode-20041004/rng-parse.elc | Bin 0 -> 2853 bytes site-lisp/nxml-mode-20041004/rng-pttrn.el | 189 + site-lisp/nxml-mode-20041004/rng-pttrn.elc | Bin 0 -> 3782 bytes site-lisp/nxml-mode-20041004/rng-uri.el | 355 + site-lisp/nxml-mode-20041004/rng-uri.elc | Bin 0 -> 7988 bytes site-lisp/nxml-mode-20041004/rng-util.el | 172 + site-lisp/nxml-mode-20041004/rng-util.elc | Bin 0 -> 4050 bytes site-lisp/nxml-mode-20041004/rng-valid.el | 1467 ++ site-lisp/nxml-mode-20041004/rng-valid.elc | Bin 0 -> 36289 bytes site-lisp/nxml-mode-20041004/rng-xsd.el | 858 ++ site-lisp/nxml-mode-20041004/rng-xsd.elc | Bin 0 -> 22967 bytes .../nxml-mode-20041004/schema/calstbl.rnc | 184 + .../nxml-mode-20041004/schema/dbcalstbl.rnc | 25 + .../nxml-mode-20041004/schema/dbdyntbl.rnc | 116 + .../nxml-mode-20041004/schema/dbhier.rnc | 1467 ++ .../nxml-mode-20041004/schema/dbnotn.rnc | 84 + .../nxml-mode-20041004/schema/dbpool.rnc | 5083 +++++++ .../nxml-mode-20041004/schema/dbsoextbl.rnc | 30 + .../nxml-mode-20041004/schema/dbstart.rnc | 23 + .../schema/docbook-dyntbl.rnc | 18 + .../schema/docbook-soextbl.rnc | 17 + .../nxml-mode-20041004/schema/docbook.rnc | 48 + .../nxml-mode-20041004/schema/locate.rnc | 200 + .../nxml-mode-20041004/schema/rdfxml.rnc | 205 + .../nxml-mode-20041004/schema/relaxng.rnc | 63 + .../nxml-mode-20041004/schema/schemas.xml | 36 + .../nxml-mode-20041004/schema/soextbl.rnc | 260 + .../schema/xhtml-applet.rnc | 19 + .../schema/xhtml-attribs.rnc | 14 + .../nxml-mode-20041004/schema/xhtml-base.rnc | 5 + .../schema/xhtml-basic-form.rnc | 63 + .../schema/xhtml-basic-table.rnc | 28 + .../nxml-mode-20041004/schema/xhtml-bdo.rnc | 7 + .../schema/xhtml-csismap.rnc | 29 + .../schema/xhtml-datatypes.rnc | 47 + .../nxml-mode-20041004/schema/xhtml-edit.rnc | 12 + .../schema/xhtml-events.rnc | 47 + .../nxml-mode-20041004/schema/xhtml-form.rnc | 49 + .../schema/xhtml-frames.rnc | 26 + .../schema/xhtml-hypertext.rnc | 16 + .../schema/xhtml-iframe.rnc | 14 + .../nxml-mode-20041004/schema/xhtml-image.rnc | 11 + .../schema/xhtml-inlstyle.rnc | 3 + .../schema/xhtml-legacy.rnc | 100 + .../nxml-mode-20041004/schema/xhtml-link.rnc | 13 + .../nxml-mode-20041004/schema/xhtml-list.rnc | 16 + .../nxml-mode-20041004/schema/xhtml-meta.rnc | 10 + .../schema/xhtml-nameident.rnc | 10 + .../schema/xhtml-object.rnc | 24 + .../nxml-mode-20041004/schema/xhtml-param.rnc | 9 + .../nxml-mode-20041004/schema/xhtml-pres.rnc | 18 + .../nxml-mode-20041004/schema/xhtml-ruby.rnc | 21 + .../schema/xhtml-script.rnc | 15 + .../schema/xhtml-ssismap.rnc | 5 + .../schema/xhtml-struct.rnc | 14 + .../nxml-mode-20041004/schema/xhtml-style.rnc | 10 + .../nxml-mode-20041004/schema/xhtml-table.rnc | 67 + .../schema/xhtml-target.rnc | 8 + .../nxml-mode-20041004/schema/xhtml-text.rnc | 73 + site-lisp/nxml-mode-20041004/schema/xhtml.rnc | 37 + site-lisp/nxml-mode-20041004/schema/xslt.rnc | 356 + site-lisp/nxml-mode-20041004/test.invalid.xml | 8 + site-lisp/nxml-mode-20041004/test.valid.xml | 8 + site-lisp/nxml-mode-20041004/xmltok.el | 1925 +++ site-lisp/nxml-mode-20041004/xmltok.elc | Bin 0 -> 40137 bytes site-lisp/nxml-mode-20041004/xsd-regexp.el | 2121 +++ site-lisp/nxml-mode-20041004/xsd-regexp.elc | Bin 0 -> 41113 bytes site-lisp/powershell-mode (Bifrost).el | 211 + site-lisp/powershell-mode.el | 213 + site-lisp/powershell-mode.elc | Bin 0 -> 4584 bytes site-lisp/pycomplete.el | 36 + site-lisp/pycomplete.py | 96 + site-lisp/python-mode.el | 3910 +++++ site-lisp/sass-mode.el | 201 + site-lisp/sd.el | 3951 +++++ site-lisp/sd.elc | Bin 0 -> 110488 bytes site-lisp/sgml-mode.el | 2023 +++ site-lisp/sgml-mode.elc | Bin 0 -> 76909 bytes site-lisp/subdirs.el | 2 + site-lisp/tads2-mode.el | 1323 ++ site-lisp/tfs.el | 553 + site-lisp/update_watch.rb | 13 + site-lisp/vbinit.el | 13 + site-lisp/vbp-mode.el | 340 + site-lisp/visual-basic-mode.el | 941 ++ 813 files changed, 345031 insertions(+) create mode 100644 .emacs.d/auto-save-list/.saves-10156-BIFROST~ create mode 100644 .emacs.d/auto-save-list/.saves-10232-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-10324-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-1040-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-10948-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-11052-RECENTCONVERT~ create mode 100644 .emacs.d/auto-save-list/.saves-11368-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-12124-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-12188-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-1284-GABRIEL-JD~ create mode 100644 .emacs.d/auto-save-list/.saves-13692-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-152-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-15596-GABRIEL-JD~ create mode 100644 .emacs.d/auto-save-list/.saves-172-JOHNDOTY-IDES~ create mode 100644 .emacs.d/auto-save-list/.saves-18888-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-1952-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-2044-BIFROST~ create mode 100644 .emacs.d/auto-save-list/.saves-2312-GABRIEL-JD~ create mode 100644 .emacs.d/auto-save-list/.saves-2396-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-2440-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-2668-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-2704-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-2824-GABRIEL-JD~ create mode 100644 .emacs.d/auto-save-list/.saves-2992-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-3032-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-3080-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-31780-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-3328-GABRIEL-JD~ create mode 100644 .emacs.d/auto-save-list/.saves-3488-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-3536-BIFROST~ create mode 100644 .emacs.d/auto-save-list/.saves-3540-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-3540-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-3584-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-3724-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-3732-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-3752-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-3800-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-3808-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-3920-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-4036-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-4076-GABRIEL-JD~ create mode 100644 .emacs.d/auto-save-list/.saves-4084-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-4172-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-4184-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-4276-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-4284-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-4448-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-4452-GABRIEL-JD~ create mode 100644 .emacs.d/auto-save-list/.saves-4504-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-4576-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-4608-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-4628-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-4708-BIFROST~ create mode 100644 .emacs.d/auto-save-list/.saves-4728-JOHNDOTY-IDES~ create mode 100644 .emacs.d/auto-save-list/.saves-4728-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-4780-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-4936-BIFROST~ create mode 100644 .emacs.d/auto-save-list/.saves-4944-GABRIEL-JD~ create mode 100644 .emacs.d/auto-save-list/.saves-4952-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-5060-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-5112-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-5120-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-5148-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-5196-JOHNDOTY-IDES~ create mode 100644 .emacs.d/auto-save-list/.saves-5204-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-5264-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-5276-BIFROST~ create mode 100644 .emacs.d/auto-save-list/.saves-5276-GABRIEL-JD~ create mode 100644 .emacs.d/auto-save-list/.saves-5288-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-5356-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-5444-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-5464-BIFROST~ create mode 100644 .emacs.d/auto-save-list/.saves-5480-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-5648-GABRIEL-JD~ create mode 100644 .emacs.d/auto-save-list/.saves-5672-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-5880-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-5908-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-5984-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-6004-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-6024-JOHNDOTY-IDES~ create mode 100644 .emacs.d/auto-save-list/.saves-6120-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-6196-BIFROST~ create mode 100644 .emacs.d/auto-save-list/.saves-6272-BIFROST~ create mode 100644 .emacs.d/auto-save-list/.saves-6412-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-6488-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-6508-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-6596-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-668-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-6768-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-6808-JOHNDOTY-IDES~ create mode 100644 .emacs.d/auto-save-list/.saves-6972-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-7048-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-7104-GABRIEL-JD~ create mode 100644 .emacs.d/auto-save-list/.saves-7248-BIFROST~ create mode 100644 .emacs.d/auto-save-list/.saves-732-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-7384-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-7440-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-748-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-7560-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-7652-GABRIEL-JD~ create mode 100644 .emacs.d/auto-save-list/.saves-7656-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-7712-GABRIEL-JD~ create mode 100644 .emacs.d/auto-save-list/.saves-7788-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-7792-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-7912-GABRIEL-JD~ create mode 100644 .emacs.d/auto-save-list/.saves-7944-JOHNDOTY1~ create mode 100644 .emacs.d/auto-save-list/.saves-8124-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-8332-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-8360-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-8396-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-8468-GABRIEL-JD~ create mode 100644 .emacs.d/auto-save-list/.saves-8684-GABRIEL-JD~ create mode 100644 .emacs.d/auto-save-list/.saves-8732-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-8888-BIFROST~ create mode 100644 .emacs.d/auto-save-list/.saves-8900-JOHNDOTY-IDES~ create mode 100644 .emacs.d/auto-save-list/.saves-904-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-9212-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-9236-JOHNDOTY-1~ create mode 100644 .emacs.d/auto-save-list/.saves-9256-BIFROST~ create mode 100644 .emacs.d/auto-save-list/.saves-9396-JOHNDOTY-IDES~ create mode 100644 .emacs.d/auto-save-list/.saves-9536-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/auto-save-list/.saves-9668-JOHNDOTY-USBOX~ create mode 100644 .emacs.d/elpa/archive-contents create mode 100644 .emacs.d/elpa/builtin-packages create mode 100644 .emacs.d/elpa/package.el create mode 100644 .emacs.d/init (JOHNDOTY-1).el create mode 100644 .emacs.d/init.el create mode 100644 .emacs.d/tramp create mode 100644 .gitconfig create mode 100644 WindowsPowershell/Modules/PowerBoots/Add-BootsFunction.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/ContentProperties.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/DependencyProperties.clixml create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-Microsoft.Win32.OpenFileDialog.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-Microsoft.Win32.SaveFileDialog.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Annotations.Annotation.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Annotations.AnnotationResource.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Annotations.ContentLocator.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Annotations.ContentLocatorGroup.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.AttachedPropertyBrowsableForChildrenAttribute.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.ColorConvertedBitmapExtension.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.ComponentResourceKey.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Condition.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.ConditionCollection.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.AccessText.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.AdornedElementPlaceholder.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.AlternationConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.BooleanToVisibilityConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Border.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.BorderGapMaskConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Button.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Canvas.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.CheckBox.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.ColumnDefinition.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.ComboBox.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.ComboBoxItem.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.ContentControl.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.ContentPresenter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.ContextMenu.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Control.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.ControlTemplate.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.DataErrorValidationRule.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.DataTemplateSelector.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Decorator.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.DockPanel.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.DocumentViewer.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.ExceptionValidationRule.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Expander.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.FlowDocumentPageViewer.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.FlowDocumentReader.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.FlowDocumentScrollViewer.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Frame.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Grid.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.GridSplitter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.GridView.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.GridViewColumn.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.GridViewColumnCollection.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.GridViewColumnHeader.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.GridViewHeaderRowPresenter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.GridViewRowPresenter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.GroupBox.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.GroupItem.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.GroupStyle.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.HeaderedContentControl.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.HeaderedItemsControl.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Image.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.InkCanvas.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.InkPresenter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.ItemsControl.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.ItemsPanelTemplate.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.ItemsPresenter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Label.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.ListBox.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.ListBoxItem.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.ListView.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.ListViewItem.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.MediaElement.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Menu.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.MenuItem.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.MenuScrollingVisibilityConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Page.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.PasswordBox.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Primitives.BulletDecorator.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Primitives.DocumentPageView.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Primitives.Popup.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Primitives.RepeatButton.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Primitives.ResizeGrip.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Primitives.ScrollBar.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Primitives.StatusBar.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Primitives.StatusBarItem.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Primitives.TabPanel.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Primitives.Thumb.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Primitives.TickBar.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Primitives.ToggleButton.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Primitives.ToolBarOverflowPanel.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Primitives.ToolBarPanel.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Primitives.Track.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Primitives.UniformGrid.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.PrintDialog.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.PrintDialogException.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.ProgressBar.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.RadioButton.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.RichTextBox.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.RowDefinition.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.ScrollContentPresenter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.ScrollViewer.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Separator.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Slider.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.SoundPlayerAction.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.StackPanel.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.StyleSelector.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.TabControl.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.TabItem.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.TextBlock.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.TextBox.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.ToolBar.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.ToolBarTray.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.ToolTip.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.TreeView.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.TreeViewItem.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.UserControl.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Viewbox.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.Viewport3D.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.VirtualizingStackPanel.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.WebBrowser.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Controls.WrapPanel.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.CornerRadiusConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Data.Binding.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Data.BindingGroup.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Data.CollectionContainer.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Data.CollectionViewSource.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Data.CompositeCollection.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Data.MultiBinding.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Data.ObjectDataProvider.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Data.PriorityBinding.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Data.PropertyGroupDescription.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Data.RelativeSource.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Data.ValueUnavailableException.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Data.XmlDataProvider.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Data.XmlNamespaceMapping.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Data.XmlNamespaceMappingCollection.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.DataTemplate.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.DataTemplateKey.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.DataTrigger.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.DialogResultConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.AdornerDecorator.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.BlockUIContainer.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.Bold.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.DocumentReference.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.DocumentStructures.BlockElement.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.DocumentStructures.FigureStructure.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.DocumentStructures.ListItemStructure.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.DocumentStructures.ListStructure.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.DocumentStructures.NamedElement.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.DocumentStructures.ParagraphStructure.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.DocumentStructures.SectionStructure.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.DocumentStructures.StoryBreak.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.DocumentStructures.StoryFragment.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.DocumentStructures.StoryFragments.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.DocumentStructures.TableCellStructure.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.DocumentStructures.TableRowGroupStructure.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.DocumentStructures.TableRowStructure.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.DocumentStructures.TableStructure.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.Figure.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.FixedDocument.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.FixedDocumentSequence.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.FixedPage.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.Floater.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.FlowDocument.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.Glyphs.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.Hyperlink.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.InlineUIContainer.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.Italic.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.LineBreak.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.LinkTarget.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.LinkTargetCollection.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.List.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.ListItem.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.PageContent.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.Paragraph.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.Run.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.Section.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.Span.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.Table.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.TableCell.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.TableColumn.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.TableRow.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.TableRowGroup.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.TextElementEditingBehaviorAttribute.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.Underline.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Documents.ZoomPercentageConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.DynamicResourceExtension.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.DynamicResourceExtensionConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.EventSetter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.EventTrigger.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.FigureLengthConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.FontSizeConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.FrameworkContentElement.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.FrameworkElement.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.FrameworkElementFactory.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.FrameworkPropertyMetadata.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.GridLengthConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.HierarchicalDataTemplate.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Input.CommandConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Interop.DocObjHost.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.LengthConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Markup.ArrayExtension.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Markup.ComponentResourceKeyConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Markup.DependencyPropertyConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Markup.Localizer.BamlLocalizableResource.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Markup.Localizer.BamlLocalizationDictionary.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Markup.Localizer.ElementLocalizability.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Markup.NamespaceMapEntry.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Markup.NullExtension.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Markup.ParserContext.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Markup.ResourceReferenceExpressionConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Markup.RoutedEventConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Markup.StaticExtension.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Markup.TemplateKeyConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Markup.TypeExtension.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Markup.XamlParseException.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Markup.XamlReader.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.Animation.BeginStoryboard.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.Animation.DiscreteThicknessKeyFrame.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.Animation.LinearThicknessKeyFrame.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.Animation.PauseStoryboard.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.Animation.RemoveStoryboard.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.Animation.ResumeStoryboard.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.Animation.SeekStoryboard.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.Animation.SetStoryboardSpeedRatio.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.Animation.SkipStoryboardToFill.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.Animation.SplineThicknessKeyFrame.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.Animation.StopStoryboard.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.Animation.Storyboard.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.Animation.ThicknessAnimation.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.Animation.ThicknessAnimationUsingKeyFrames.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.Animation.ThicknessKeyFrameCollection.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.Effects.BevelBitmapEffect.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.Effects.BitmapEffectGroup.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.Effects.BlurBitmapEffect.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.Effects.DropShadowBitmapEffect.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.Effects.EmbossBitmapEffect.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.Effects.OuterGlowBitmapEffect.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.GradientStop.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.ImageBrush.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.ImageDrawing.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.LinearGradientBrush.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.MatrixTransform.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.MediaPlayer.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.RadialGradientBrush.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.RotateTransform.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.ScaleTransform.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.SkewTransform.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.TransformGroup.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.TranslateTransform.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.VideoDrawing.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Media.VisualBrush.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.MultiDataTrigger.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.MultiTrigger.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.NameScope.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Navigation.JournalEntryListConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Navigation.JournalEntryUnifiedViewConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Navigation.NavigationWindow.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.NullableBoolConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.PropertyPathConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.ResourceDictionary.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.ResourceReferenceKeyNotFoundException.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Resources.ContentTypes.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Resources.StreamResourceInfo.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Setter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.SetterBaseCollection.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Shapes.Ellipse.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Shapes.Line.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Shapes.Path.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Shapes.Polygon.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Shapes.Polyline.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Shapes.Rectangle.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.StaticResourceExtension.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Style.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.StyleTypedPropertyAttribute.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.TemplateBindingExpressionConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.TemplateBindingExtension.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.TemplateBindingExtensionConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.TemplatePartAttribute.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.ThemeDictionaryExtension.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.ThicknessConverter.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Trigger.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.TriggerActionCollection.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.Window.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Functions/New-System.Windows.WindowCollection.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/New-BootsImage.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Out-BootsWindow.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/PoshWpf.dll create mode 100644 WindowsPowershell/Modules/PowerBoots/PoshWpf.psd1 create mode 100644 WindowsPowershell/Modules/PowerBoots/PowerBoots.psd1 create mode 100644 WindowsPowershell/Modules/PowerBoots/PowerBoots.psm1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Reset-DefaultBoots.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Samples/Clock.xaml create mode 100644 WindowsPowershell/Modules/PowerBoots/Samples/Samples.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Samples/Select-GraphicalFilteredObject.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/Set-DependencyProperty.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/UtilityFunctions.ps1 create mode 100644 WindowsPowershell/Modules/PowerBoots/WpfTypes.format.ps1xml create mode 100644 WindowsPowershell/Modules/PowerBoots/WpfTypes.types.ps1xml create mode 100644 WindowsPowershell/Modules/PowerBoots/XamlTemplates/DavesGlossyLight.xaml create mode 100644 WindowsPowershell/Modules/PowerBoots/XamlTemplates/default.xaml create mode 100644 WindowsPowershell/Modules/PowerBoots/XamlTemplates/huddledcontrols.xaml create mode 100644 WindowsPowershell/Modules/VSProject/VSProject.ps1 create mode 100644 WindowsPowershell/Profile.ps1 create mode 100644 WindowsPowershell/a.out create mode 100644 site-lisp/ChangeLog create mode 100644 site-lisp/INSTALL create mode 100644 site-lisp/Makefile create mode 100644 site-lisp/Makefile.in create mode 100644 site-lisp/cc-mode/5.31.2/COPYING create mode 100644 site-lisp/cc-mode/5.31.2/MANIFEST create mode 100644 site-lisp/cc-mode/5.31.2/NEWS create mode 100644 site-lisp/cc-mode/5.31.2/README create mode 100644 site-lisp/cc-mode/5.31.2/cc-align.el create mode 100644 site-lisp/cc-mode/5.31.2/cc-align.elc create mode 100644 site-lisp/cc-mode/5.31.2/cc-awk.el create mode 100644 site-lisp/cc-mode/5.31.2/cc-awk.elc create mode 100644 site-lisp/cc-mode/5.31.2/cc-bytecomp.el create mode 100644 site-lisp/cc-mode/5.31.2/cc-bytecomp.elc create mode 100644 site-lisp/cc-mode/5.31.2/cc-cmds.el create mode 100644 site-lisp/cc-mode/5.31.2/cc-cmds.elc create mode 100644 site-lisp/cc-mode/5.31.2/cc-compat.el create mode 100644 site-lisp/cc-mode/5.31.2/cc-compat.elc create mode 100644 site-lisp/cc-mode/5.31.2/cc-defs.el create mode 100644 site-lisp/cc-mode/5.31.2/cc-defs.elc create mode 100644 site-lisp/cc-mode/5.31.2/cc-engine.el create mode 100644 site-lisp/cc-mode/5.31.2/cc-engine.elc create mode 100644 site-lisp/cc-mode/5.31.2/cc-fix.el create mode 100644 site-lisp/cc-mode/5.31.2/cc-fix.elc create mode 100644 site-lisp/cc-mode/5.31.2/cc-fonts.el create mode 100644 site-lisp/cc-mode/5.31.2/cc-fonts.elc create mode 100644 site-lisp/cc-mode/5.31.2/cc-guess.el create mode 100644 site-lisp/cc-mode/5.31.2/cc-guess.elc create mode 100644 site-lisp/cc-mode/5.31.2/cc-langs.el create mode 100644 site-lisp/cc-mode/5.31.2/cc-langs.elc create mode 100644 site-lisp/cc-mode/5.31.2/cc-lobotomy.el create mode 100644 site-lisp/cc-mode/5.31.2/cc-lobotomy.elc create mode 100644 site-lisp/cc-mode/5.31.2/cc-menus.el create mode 100644 site-lisp/cc-mode/5.31.2/cc-menus.elc create mode 100644 site-lisp/cc-mode/5.31.2/cc-mode.el create mode 100644 site-lisp/cc-mode/5.31.2/cc-mode.elc create mode 100644 site-lisp/cc-mode/5.31.2/cc-mode.texi create mode 100644 site-lisp/cc-mode/5.31.2/cc-styles.el create mode 100644 site-lisp/cc-mode/5.31.2/cc-styles.elc create mode 100644 site-lisp/cc-mode/5.31.2/cc-subword.el create mode 100644 site-lisp/cc-mode/5.31.2/cc-subword.elc create mode 100644 site-lisp/cc-mode/5.31.2/cc-vars.el create mode 100644 site-lisp/cc-mode/5.31.2/cc-vars.elc create mode 100644 site-lisp/cc-mode/5.31.2/csharp-mode-0.5.0.el create mode 100644 site-lisp/cc-mode/5.31.2/elc/cc-align.elc create mode 100644 site-lisp/cc-mode/5.31.2/elc/cc-awk.elc create mode 100644 site-lisp/cc-mode/5.31.2/elc/cc-bytecomp.elc create mode 100644 site-lisp/cc-mode/5.31.2/elc/cc-cmds.elc create mode 100644 site-lisp/cc-mode/5.31.2/elc/cc-compat.elc create mode 100644 site-lisp/cc-mode/5.31.2/elc/cc-defs.elc create mode 100644 site-lisp/cc-mode/5.31.2/elc/cc-engine.elc create mode 100644 site-lisp/cc-mode/5.31.2/elc/cc-fix.elc create mode 100644 site-lisp/cc-mode/5.31.2/elc/cc-fonts.elc create mode 100644 site-lisp/cc-mode/5.31.2/elc/cc-guess.elc create mode 100644 site-lisp/cc-mode/5.31.2/elc/cc-langs.elc create mode 100644 site-lisp/cc-mode/5.31.2/elc/cc-lobotomy.elc create mode 100644 site-lisp/cc-mode/5.31.2/elc/cc-menus.elc create mode 100644 site-lisp/cc-mode/5.31.2/elc/cc-mode.elc create mode 100644 site-lisp/cc-mode/5.31.2/elc/cc-styles.elc create mode 100644 site-lisp/cc-mode/5.31.2/elc/cc-subword.elc create mode 100644 site-lisp/cc-mode/5.31.2/elc/cc-vars.elc create mode 100644 site-lisp/cc-mode/5.31.2/elc/csharp-mode-0.5.0.elc create mode 100644 site-lisp/cc-mode/5.31.3/COPYING create mode 100644 site-lisp/cc-mode/5.31.3/MANIFEST create mode 100644 site-lisp/cc-mode/5.31.3/NEWS create mode 100644 site-lisp/cc-mode/5.31.3/README create mode 100644 site-lisp/cc-mode/5.31.3/cc-align.el create mode 100644 site-lisp/cc-mode/5.31.3/cc-align.elc create mode 100644 site-lisp/cc-mode/5.31.3/cc-awk.el create mode 100644 site-lisp/cc-mode/5.31.3/cc-awk.elc create mode 100644 site-lisp/cc-mode/5.31.3/cc-bytecomp.el create mode 100644 site-lisp/cc-mode/5.31.3/cc-bytecomp.elc create mode 100644 site-lisp/cc-mode/5.31.3/cc-cmds.el create mode 100644 site-lisp/cc-mode/5.31.3/cc-cmds.elc create mode 100644 site-lisp/cc-mode/5.31.3/cc-compat.el create mode 100644 site-lisp/cc-mode/5.31.3/cc-compat.elc create mode 100644 site-lisp/cc-mode/5.31.3/cc-defs.el create mode 100644 site-lisp/cc-mode/5.31.3/cc-defs.elc create mode 100644 site-lisp/cc-mode/5.31.3/cc-engine.el create mode 100644 site-lisp/cc-mode/5.31.3/cc-engine.elc create mode 100644 site-lisp/cc-mode/5.31.3/cc-fix.el create mode 100644 site-lisp/cc-mode/5.31.3/cc-fix.elc create mode 100644 site-lisp/cc-mode/5.31.3/cc-fonts.el create mode 100644 site-lisp/cc-mode/5.31.3/cc-fonts.elc create mode 100644 site-lisp/cc-mode/5.31.3/cc-guess.el create mode 100644 site-lisp/cc-mode/5.31.3/cc-guess.elc create mode 100644 site-lisp/cc-mode/5.31.3/cc-langs.el create mode 100644 site-lisp/cc-mode/5.31.3/cc-langs.elc create mode 100644 site-lisp/cc-mode/5.31.3/cc-lobotomy.el create mode 100644 site-lisp/cc-mode/5.31.3/cc-lobotomy.elc create mode 100644 site-lisp/cc-mode/5.31.3/cc-menus.el create mode 100644 site-lisp/cc-mode/5.31.3/cc-menus.elc create mode 100644 site-lisp/cc-mode/5.31.3/cc-mode.el create mode 100644 site-lisp/cc-mode/5.31.3/cc-mode.elc create mode 100644 site-lisp/cc-mode/5.31.3/cc-mode.texi create mode 100644 site-lisp/cc-mode/5.31.3/cc-styles.el create mode 100644 site-lisp/cc-mode/5.31.3/cc-styles.elc create mode 100644 site-lisp/cc-mode/5.31.3/cc-subword.el create mode 100644 site-lisp/cc-mode/5.31.3/cc-subword.elc create mode 100644 site-lisp/cc-mode/5.31.3/cc-vars.el create mode 100644 site-lisp/cc-mode/5.31.3/cc-vars.elc create mode 100644 site-lisp/cc-mode/5.31.3/csharp-mode-0.5.0.el create mode 100644 site-lisp/cc-mode/5.31.3/csharp-mode-0.5.0.elc create mode 100644 site-lisp/cc-mode/5.31.3/csharp-mode-0.6.0.el create mode 100644 site-lisp/cc-mode/5.31.3/csharp-mode-0.6.0.elc create mode 100644 site-lisp/cc-mode/csharp-only/csharp-mode-0.5.0.el create mode 100644 site-lisp/cc-mode/csharp-only/csharp-mode-0.6.0.el create mode 100644 site-lisp/cc-mode/readme.txt create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-align.el create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-align.elc create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-bytecomp.el create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-bytecomp.elc create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-cmds.el create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-cmds.elc create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-compat.el create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-compat.elc create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-defs.el create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-defs.elc create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-engine.el create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-engine.elc create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-langs.el create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-langs.elc create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-menus.el create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-menus.elc create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-mode.el create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-mode.elc create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-styles.el create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-styles.elc create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-vars.el create mode 100644 site-lisp/cc-mode/zbrad-integrated/cc-vars.elc create mode 100644 site-lisp/ci.el create mode 100644 site-lisp/ci.elc create mode 100644 site-lisp/configure create mode 100644 site-lisp/configure.in create mode 100644 site-lisp/doctest-mode.el create mode 100644 site-lisp/filladapt.el create mode 100644 site-lisp/filladapt.elc create mode 100644 site-lisp/font-lock.el create mode 100644 site-lisp/font-lock.elc create mode 100644 site-lisp/haml-mode.el create mode 100644 site-lisp/html-helper-mode.el create mode 100644 site-lisp/install-sh create mode 100644 site-lisp/iso88591.map create mode 100644 site-lisp/javascript-mode.el create mode 100644 site-lisp/javascript-mode.elc create mode 100644 site-lisp/js2 (JOHNDOTY-1).el create mode 100644 site-lisp/js2 (JOHNDOTY-1).elc create mode 100644 site-lisp/js2.el create mode 100644 site-lisp/js2.elc create mode 100644 site-lisp/lua-mode.el create mode 100644 site-lisp/lua-mode.elc create mode 100644 site-lisp/m-mode.el create mode 100644 site-lisp/mkinstalldirs create mode 100644 site-lisp/mode-motion.el create mode 100644 site-lisp/msbuild.el create mode 100644 site-lisp/nxml-mode-20041004/COPYING create mode 100644 site-lisp/nxml-mode-20041004/Makefile create mode 100644 site-lisp/nxml-mode-20041004/NEWS create mode 100644 site-lisp/nxml-mode-20041004/README create mode 100644 site-lisp/nxml-mode-20041004/TODO create mode 100644 site-lisp/nxml-mode-20041004/VERSION create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00000-0007F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00080-000FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00100-0017F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00180-0024F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00250-002AF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/002B0-002FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00300-0036F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00370-003FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00400-004FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00500-0052F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00530-0058F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00590-005FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00600-006FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00700-0074F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00780-007BF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00900-0097F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00980-009FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00A00-00A7F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00A80-00AFF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00B00-00B7F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00B80-00BFF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00C00-00C7F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00C80-00CFF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00D00-00D7F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00D80-00DFF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00E00-00E7F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00E80-00EFF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/00F00-00FFF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/01000-0109F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/010A0-010FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/01100-011FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/01200-0137F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/013A0-013FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/01400-0167F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/01680-0169F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/016A0-016FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/01700-0171F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/01720-0173F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/01740-0175F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/01760-0177F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/01780-017FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/01800-018AF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/01E00-01EFF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/01F00-01FFF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/02000-0206F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/02070-0209F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/020A0-020CF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/020D0-020FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/02100-0214F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/02150-0218F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/02190-021FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/02200-022FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/02300-023FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/02400-0243F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/02440-0245F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/02460-024FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/02500-0257F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/02580-0259F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/025A0-025FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/02600-026FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/02700-027BF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/027C0-027EF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/027F0-027FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/02800-028FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/02900-0297F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/02980-029FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/02A00-02AFF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/02E80-02EFF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/02F00-02FDF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/02FF0-02FFF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/03000-0303F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/03040-0309F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/030A0-030FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/03100-0312F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/03130-0318F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/03190-0319F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/031A0-031BF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/031F0-031FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/03200-032FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/03300-033FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/03400-04DBF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/0A000-0A48F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/0A490-0A4CF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/0FB00-0FB4F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/0FB50-0FDFF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/0FE00-0FE0F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/0FE20-0FE2F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/0FE30-0FE4F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/0FE50-0FE6F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/0FE70-0FEFF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/0FF00-0FFEF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/0FFF0-0FFFF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/10300-1032F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/10330-1034F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/10400-1044F.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/1D000-1D0FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/1D100-1D1FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/1D400-1D7FF.el create mode 100644 site-lisp/nxml-mode-20041004/char-name/unicode/E0000-E007F.el create mode 100644 site-lisp/nxml-mode-20041004/dir create mode 100644 site-lisp/nxml-mode-20041004/nxml-enc.el create mode 100644 site-lisp/nxml-mode-20041004/nxml-enc.elc create mode 100644 site-lisp/nxml-mode-20041004/nxml-glyph.el create mode 100644 site-lisp/nxml-mode-20041004/nxml-glyph.elc create mode 100644 site-lisp/nxml-mode-20041004/nxml-maint.el create mode 100644 site-lisp/nxml-mode-20041004/nxml-maint.elc create mode 100644 site-lisp/nxml-mode-20041004/nxml-mode.el create mode 100644 site-lisp/nxml-mode-20041004/nxml-mode.elc create mode 100644 site-lisp/nxml-mode-20041004/nxml-mode.info create mode 100644 site-lisp/nxml-mode-20041004/nxml-mode.rnc create mode 100644 site-lisp/nxml-mode-20041004/nxml-mode.texi create mode 100644 site-lisp/nxml-mode-20041004/nxml-mode.xml create mode 100644 site-lisp/nxml-mode-20041004/nxml-ns.el create mode 100644 site-lisp/nxml-mode-20041004/nxml-ns.elc create mode 100644 site-lisp/nxml-mode-20041004/nxml-outln.el create mode 100644 site-lisp/nxml-mode-20041004/nxml-outln.elc create mode 100644 site-lisp/nxml-mode-20041004/nxml-parse.el create mode 100644 site-lisp/nxml-mode-20041004/nxml-parse.elc create mode 100644 site-lisp/nxml-mode-20041004/nxml-rap.el create mode 100644 site-lisp/nxml-mode-20041004/nxml-rap.elc create mode 100644 site-lisp/nxml-mode-20041004/nxml-uchnm.el create mode 100644 site-lisp/nxml-mode-20041004/nxml-uchnm.elc create mode 100644 site-lisp/nxml-mode-20041004/nxml-util.el create mode 100644 site-lisp/nxml-mode-20041004/nxml-util.elc create mode 100644 site-lisp/nxml-mode-20041004/rng-auto.el create mode 100644 site-lisp/nxml-mode-20041004/rng-cmpct.el create mode 100644 site-lisp/nxml-mode-20041004/rng-cmpct.elc create mode 100644 site-lisp/nxml-mode-20041004/rng-dt.el create mode 100644 site-lisp/nxml-mode-20041004/rng-dt.elc create mode 100644 site-lisp/nxml-mode-20041004/rng-loc.el create mode 100644 site-lisp/nxml-mode-20041004/rng-loc.elc create mode 100644 site-lisp/nxml-mode-20041004/rng-maint.el create mode 100644 site-lisp/nxml-mode-20041004/rng-maint.elc create mode 100644 site-lisp/nxml-mode-20041004/rng-match.el create mode 100644 site-lisp/nxml-mode-20041004/rng-match.elc create mode 100644 site-lisp/nxml-mode-20041004/rng-nxml.el create mode 100644 site-lisp/nxml-mode-20041004/rng-nxml.elc create mode 100644 site-lisp/nxml-mode-20041004/rng-parse.el create mode 100644 site-lisp/nxml-mode-20041004/rng-parse.elc create mode 100644 site-lisp/nxml-mode-20041004/rng-pttrn.el create mode 100644 site-lisp/nxml-mode-20041004/rng-pttrn.elc create mode 100644 site-lisp/nxml-mode-20041004/rng-uri.el create mode 100644 site-lisp/nxml-mode-20041004/rng-uri.elc create mode 100644 site-lisp/nxml-mode-20041004/rng-util.el create mode 100644 site-lisp/nxml-mode-20041004/rng-util.elc create mode 100644 site-lisp/nxml-mode-20041004/rng-valid.el create mode 100644 site-lisp/nxml-mode-20041004/rng-valid.elc create mode 100644 site-lisp/nxml-mode-20041004/rng-xsd.el create mode 100644 site-lisp/nxml-mode-20041004/rng-xsd.elc create mode 100644 site-lisp/nxml-mode-20041004/schema/calstbl.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/dbcalstbl.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/dbdyntbl.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/dbhier.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/dbnotn.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/dbpool.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/dbsoextbl.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/dbstart.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/docbook-dyntbl.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/docbook-soextbl.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/docbook.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/locate.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/rdfxml.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/relaxng.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/schemas.xml create mode 100644 site-lisp/nxml-mode-20041004/schema/soextbl.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-applet.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-attribs.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-base.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-basic-form.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-basic-table.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-bdo.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-csismap.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-datatypes.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-edit.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-events.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-form.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-frames.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-hypertext.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-iframe.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-image.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-inlstyle.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-legacy.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-link.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-list.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-meta.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-nameident.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-object.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-param.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-pres.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-ruby.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-script.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-ssismap.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-struct.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-style.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-table.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-target.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml-text.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xhtml.rnc create mode 100644 site-lisp/nxml-mode-20041004/schema/xslt.rnc create mode 100644 site-lisp/nxml-mode-20041004/test.invalid.xml create mode 100644 site-lisp/nxml-mode-20041004/test.valid.xml create mode 100644 site-lisp/nxml-mode-20041004/xmltok.el create mode 100644 site-lisp/nxml-mode-20041004/xmltok.elc create mode 100644 site-lisp/nxml-mode-20041004/xsd-regexp.el create mode 100644 site-lisp/nxml-mode-20041004/xsd-regexp.elc create mode 100644 site-lisp/powershell-mode (Bifrost).el create mode 100644 site-lisp/powershell-mode.el create mode 100644 site-lisp/powershell-mode.elc create mode 100644 site-lisp/pycomplete.el create mode 100644 site-lisp/pycomplete.py create mode 100644 site-lisp/python-mode.el create mode 100644 site-lisp/sass-mode.el create mode 100644 site-lisp/sd.el create mode 100644 site-lisp/sd.elc create mode 100644 site-lisp/sgml-mode.el create mode 100644 site-lisp/sgml-mode.elc create mode 100644 site-lisp/subdirs.el create mode 100644 site-lisp/tads2-mode.el create mode 100644 site-lisp/tfs.el create mode 100644 site-lisp/update_watch.rb create mode 100644 site-lisp/vbinit.el create mode 100644 site-lisp/vbp-mode.el create mode 100644 site-lisp/visual-basic-mode.el diff --git a/.emacs.d/auto-save-list/.saves-10156-BIFROST~ b/.emacs.d/auto-save-list/.saves-10156-BIFROST~ new file mode 100644 index 0000000..87a57af --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-10156-BIFROST~ @@ -0,0 +1,4 @@ +f:/src/misc/tatt.ps1 +f:\src\misc\#tatt.ps1# +f:/src/misc/fixpaths.ps1 +f:\src\misc\#fixpaths.ps1# diff --git a/.emacs.d/auto-save-list/.saves-10232-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-10232-JOHNDOTY-1~ new file mode 100644 index 0000000..e69de29 diff --git a/.emacs.d/auto-save-list/.saves-10324-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-10324-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..d2e9abc --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-10324-JOHNDOTY-USBOX~ @@ -0,0 +1,8 @@ +z:/src/nt/com/complus/dtc/dtc/MsDtc/Src/MSDTC.CPP +z:\src\nt\com\complus\dtc\dtc\MsDtc\Src\#MSDTC.CPP# +z:/src/dd/Lab21S/ndp/clr/src/BCL/Microsoft/Win32/Win32Native.cs +z:\src\dd\Lab21S\ndp\clr\src\BCL\Microsoft\Win32\#Win32Native.cs# +z:/src/dd/Lab21S/ndp/clr/src/BCL/Microsoft/Win32/SafeHandles/SafeFileHandle.cs +z:\src\dd\Lab21S\ndp\clr\src\BCL\Microsoft\Win32\SafeHandles\#SafeFileHandle.cs# +z:/src/dd/Lab21S/ndp/clr/src/BCL/Microsoft/Win32/SafeHandles/Win32SafeHandles.cs +z:\src\dd\Lab21S\ndp\clr\src\BCL\Microsoft\Win32\SafeHandles\#Win32SafeHandles.cs# diff --git a/.emacs.d/auto-save-list/.saves-1040-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-1040-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..8a59dd7 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-1040-JOHNDOTY-USBOX~ @@ -0,0 +1,20 @@ +z:/src/nt_private/com/complus/dtc/dtc/DTCUic/src/propsheetextension.cpp +z:\src\nt_private\com\complus\dtc\dtc\DTCUic\src\#propsheetextension.cpp# +z:/src/nt_private/com/complus/dtc/dtc/DTCUic/inc/tminstancenode.h +z:\src\nt_private\com\complus\dtc\dtc\DTCUic\inc\#tminstancenode.h# +z:/src/nt_private/com/complus/dtc/dtc/DTCUic/src/tminstancenode.cpp +z:\src\nt_private\com\complus\dtc\dtc\DTCUic\src\#tminstancenode.cpp# +z:/src/nt_private/com/complus/dtc/inc/DTC.H +z:\src\nt_private\com\complus\dtc\inc\#DTC.H# +z:/src/nt_private/com/complus/dtc/dtc/MsDtcPrx/src/dtcprxrm.cpp +z:\src\nt_private\com\complus\dtc\dtc\MsDtcPrx\src\#dtcprxrm.cpp# +z:/src/nt_private/com/complus/dtc/dtc/MsDtcPrx/src/phase0.cpp +z:\src\nt_private\com\complus\dtc\dtc\MsDtcPrx\src\#phase0.cpp# +z:/src/nt_private/com/complus/dtc/dtc/MsDtcPrx/src/RMObj.cpp +z:\src\nt_private\com\complus\dtc\dtc\MsDtcPrx\src\#RMObj.cpp# +z:/src/com10/Src/Dtc/TM/inc/tmsuptem.h +z:\src\com10\Src\Dtc\TM\inc\#tmsuptem.h# +z:/src/com10/Src/Dtc/TM/src/tmsuper.cpp +z:\src\com10\Src\Dtc\TM\src\#tmsuper.cpp# +z:/src/com10/Src/Dtc/MsDtcPrx/src/xaxact.cpp +z:\src\com10\Src\Dtc\MsDtcPrx\src\#xaxact.cpp# diff --git a/.emacs.d/auto-save-list/.saves-10948-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-10948-JOHNDOTY-1~ new file mode 100644 index 0000000..d307dca --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-10948-JOHNDOTY-1~ @@ -0,0 +1,32 @@ +c:/src/xonline/private/setup/octopus/xdl/definition/topologies/expanded.xml +c:\src\xonline\private\setup\octopus\xdl\definition\topologies\#expanded.xml# +c:/src/AutopilotService/autopilotService/Co1PPE/xboxprime-test-co1ppe/deployment.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xboxprime-test-co1ppe\#deployment.ini# +c:/src/xonline/private/setup/octopus/xdl/definition/components/misc/AutopilotSpecific.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\misc\#AutopilotSpecific.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/topologies/Sandbox.xml +c:\src\xonline\private\setup\octopus\xdl\definition\topologies\#Sandbox.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/environments/xboxprime.xml +c:\src\xonline\private\setup\octopus\xdl\definition\environments\#xboxprime.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/environments/sandbox.xml +c:\src\xonline\private\setup\octopus\xdl\definition\environments\#sandbox.xml# +c:/src/newcommerce/Tools/xdlc/Main/private/src/xdlc/AutopilotSupport.psm1 +c:\src\newcommerce\Tools\xdlc\Main\private\src\xdlc\#AutopilotSupport.psm1# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/npdb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#npdb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/common/ConfigureServer.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\common\#ConfigureServer.xml# +c:/users/johndoty/documents/WindowsPowerShell/Profile.ps1 +c:\users\johndoty\documents\WindowsPowerShell\#Profile.ps1# +c:/src/commerce/PurchaseService/private/shared/timers/src/Microsoft/IEB/CommercialServices/Timers/TimerProcessor.cs +c:\src\commerce\PurchaseService\private\shared\timers\src\Microsoft\IEB\CommercialServices\Timers\#TimerProcessor.cs# +c:/src/AutopilotService/autopilotService/Co1PPE/xboxprime-test-co1ppe/Environment.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xboxprime-test-co1ppe\#Environment.ini# +c:/src/AutopilotService/autopilotService/Co1PPE/xbox-Test-co1ppe/Environment.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xbox-Test-co1ppe\#Environment.ini# +c:/temp/zomgout/AutoXOnline/xboxprime/servicemap.ini +c:\temp\zomgout\AutoXOnline\xboxprime\#servicemap.ini# +c:/src/xonline/private/setup/octopus/xdl/definition/components/common/WebstoreClient.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\common\#WebstoreClient.xml# +c:/src/AutopilotService/autopilotService/Co1PPE/xboxprime-test-co1ppe/machines.csv +c:\src\AutopilotService\autopilotService\Co1PPE\xboxprime-test-co1ppe\#machines.csv# diff --git a/.emacs.d/auto-save-list/.saves-11052-RECENTCONVERT~ b/.emacs.d/auto-save-list/.saves-11052-RECENTCONVERT~ new file mode 100644 index 0000000..fe373fd --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-11052-RECENTCONVERT~ @@ -0,0 +1,16 @@ +c:/src/commerce/PurchaseService/private/shared/timers/test/timer-unittests.csproj +c:\src\commerce\PurchaseService\private\shared\timers\test\#timer-unittests.csproj# +c:/src/commerce/PurchaseService/private/service/purchase/test/TitleMetadataFDTests/TitleMetadataFDTests.csproj +c:\src\commerce\PurchaseService\private\service\purchase\test\TitleMetadataFDTests\#TitleMetadataFDTests.csproj# +c:/src/commerce/PurchaseService/private/service/purchase/test/PurchaseTestCommon/PurchaseTestCommon.csproj +c:\src\commerce\PurchaseService\private\service\purchase\test\PurchaseTestCommon\#PurchaseTestCommon.csproj# +c:/src/commerce/PurchaseService/private/service/purchase/test/PurchaseServiceTests/PurchaseServiceTests.csproj +c:\src\commerce\PurchaseService\private\service\purchase\test\PurchaseServiceTests\#PurchaseServiceTests.csproj# +c:/src/commerce/PurchaseService/private/service/purchase/test/TitleMetadataLoaderTests/TitleMetadataLoaderTests.csproj +c:\src\commerce\PurchaseService\private\service\purchase\test\TitleMetadataLoaderTests\#TitleMetadataLoaderTests.csproj# +c:/src/commerce/PurchaseService/build/webstore.targets +c:\src\commerce\PurchaseService\build\#webstore.targets# +c:/Windows/Microsoft.NET/Framework/v4.0.30319/Microsoft.Common.targets +c:\Windows\Microsoft.NET\Framework\v4.0.30319\#Microsoft.Common.targets# +c:/src/commerce/PurchaseService/private/service/purchase/test/PurchaseServiceTests/msbuild.log +c:\src\commerce\PurchaseService\private\service\purchase\test\PurchaseServiceTests\#msbuild.log# diff --git a/.emacs.d/auto-save-list/.saves-11368-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-11368-JOHNDOTY-1~ new file mode 100644 index 0000000..16f0e43 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-11368-JOHNDOTY-1~ @@ -0,0 +1,8 @@ +c:/src/misc/foo.cs +c:\src\misc\#foo.cs# +c:/src/commerce/PurchaseService/private/service/purchase/src/deployment/tools/register-xblobpurchase.ps1 +c:\src\commerce\PurchaseService\private\service\purchase\src\deployment\tools\#register-xblobpurchase.ps1# +c:/src/xonline/private/developer/johndoty/settings.ps1 +c:\src\xonline\private\developer\johndoty\#settings.ps1# +c:/Windows/System32/drivers/etc/hosts +c:\Windows\System32\drivers\etc\#hosts# diff --git a/.emacs.d/auto-save-list/.saves-12124-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-12124-JOHNDOTY-1~ new file mode 100644 index 0000000..9ce6e1b --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-12124-JOHNDOTY-1~ @@ -0,0 +1,6 @@ +c:/src/commerce/private/tools/integrate/integrate.ps1 +c:\src\commerce\private\tools\integrate\#integrate.ps1# +c:/src/commerce/private/developer/johndoty/integrate_settings.ps1 +c:\src\commerce\private\developer\johndoty\#integrate_settings.ps1# +c:/users/johndoty/documents/WindowsPowerShell/Profile.ps1 +c:\users\johndoty\documents\WindowsPowerShell\#Profile.ps1# diff --git a/.emacs.d/auto-save-list/.saves-12188-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-12188-JOHNDOTY-1~ new file mode 100644 index 0000000..9f25cfa --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-12188-JOHNDOTY-1~ @@ -0,0 +1,46 @@ +c:/temp/ADT/Esp/Merged/configuration/xblob/configuration.xml +c:\temp\ADT\Esp\Merged\configuration\xblob\#configuration.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/npdb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#npdb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/XmatchDb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#XmatchDb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/WebDb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#WebDb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/UserCommerceDb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#UserCommerceDb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/Uodb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#Uodb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/ToolsDb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#ToolsDb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/TokenDb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#TokenDb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/TitleDb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#TitleDb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/TUserDb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#TUserDb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/TTeamDb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#TTeamDb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/StoreDb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#StoreDb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/SecpDb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#SecpDb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/SecDb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#SecDb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/QueryDb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#QueryDb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/MsgDb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#MsgDb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/GenealogyDb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#GenealogyDb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/CatalogDb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#CatalogDb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/AvatarDb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#AvatarDb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/topologies/Sandbox.xml +c:\src\xonline\private\setup\octopus\xdl\definition\topologies\#Sandbox.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/installsteps/DbProdbase.xml +c:\src\xonline\private\setup\octopus\xdl\definition\installsteps\#DbProdbase.xml# +c:/src/AutopilotService/autopilotService/Co1PPE/xbox-Test-co1ppe/Environment.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xbox-Test-co1ppe\#Environment.ini# +c:/src/xonline/private/setup/octopus/xdl/definition/components/common/ConfigurePrereqs.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\common\#ConfigurePrereqs.xml# diff --git a/.emacs.d/auto-save-list/.saves-1284-GABRIEL-JD~ b/.emacs.d/auto-save-list/.saves-1284-GABRIEL-JD~ new file mode 100644 index 0000000..ecebabd --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-1284-GABRIEL-JD~ @@ -0,0 +1,4 @@ +c:/temp/radio.html +c:\temp\#radio.html# +c:/users/johndoty/documents/Downloads/listen.pls +c:\users\johndoty\documents\Downloads\#listen.pls# diff --git a/.emacs.d/auto-save-list/.saves-13692-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-13692-JOHNDOTY-1~ new file mode 100644 index 0000000..60bc7cc --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-13692-JOHNDOTY-1~ @@ -0,0 +1,64 @@ +c:/src/xonline/private/common/core/installer/XomConfigurator.cs +c:\src\xonline\private\common\core\installer\#XomConfigurator.cs# +//JOHNDOTY-1/ADT/OctopusLogs/2011-11-16_15-12-37/deploymentConfigurationUsed.xml +\\JOHNDOTY-1\ADT\OctopusLogs\2011-11-16_15-12-37\#deploymentConfigurationUsed.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/npdb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#npdb.xml# +c:/src/xonline/public/ext/tools/x86/ADT/ADTTools.ps1 +c:\src\xonline\public\ext\tools\x86\ADT\#ADTTools.ps1# +c:/src/xonline/public/ext/tools/x86/ADTScript.ps1 +c:\src\xonline\public\ext\tools\x86\#ADTScript.ps1# +c:/temp/Octopus.xml +c:\temp\#Octopus.xml# +c:/src/xonline/private/tools/adt/makefile.inc +c:\src\xonline\private\tools\adt\#makefile.inc# +c:/src/xonline/private/developer/johndoty/settings-sandbox.ps1 +c:\src\xonline\private\developer\johndoty\#settings-sandbox.ps1# +c:/src/xonline/private/server/xrlscan/XrlScan.cpp +c:\src\xonline\private\server\xrlscan\#XrlScan.cpp# +c:/src/xonline/private/common/core/installer/XomConfiguratorInstall.cs +c:\src\xonline\private\common\core\installer\#XomConfiguratorInstall.cs# +c:/src/xonline/private/common/core/feapp/FeAppInitializer.cs +c:\src\xonline\private\common\core\feapp\#FeAppInitializer.cs# +c:/src/AutopilotService/autopilotService/Co1PPE/xbox-Test-co1ppe/deployment.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xbox-Test-co1ppe\#deployment.ini# +c:/temp/zomgout/AutoXOnline/sandbox/Cleanser/start.ps1 +c:\temp\zomgout\AutoXOnline\sandbox\Cleanser\#start.ps1# +c:/temp/zomgout/AutoXOnline/sandbox/Ratings/ConfigureVIPModule.psm1 +c:\temp\zomgout\AutoXOnline\sandbox\Ratings\#ConfigureVIPModule.psm1# +c:/src/xonline/private/setup/octopus/xdl/definition/environments/sandbox.xml +c:\src\xonline\private\setup\octopus\xdl\definition\environments\#sandbox.xml# +c:/src/xonline/private/tools/XblCfg/App/actionVInterface.cs +c:\src\xonline\private\tools\XblCfg\App\#actionVInterface.cs# +c:/temp/zomgout/AutoXOnline/sandbox/Ratings/RatingsModule.psm1 +c:\temp\zomgout\AutoXOnline\sandbox\Ratings\#RatingsModule.psm1# +c:/temp/zomgout/AutoXOnline/sandbox/Ratings/SetupFrontDoorModule.psm1 +c:\temp\zomgout\AutoXOnline\sandbox\Ratings\#SetupFrontDoorModule.psm1# +c:/temp/zomgout/AutoXOnline/sandbox/Ratings/SetupFrontEndModule.psm1 +c:\temp\zomgout\AutoXOnline\sandbox\Ratings\#SetupFrontEndModule.psm1# +c:/src/xonline/private/setup/octopus/xdl/definition/components/misc/AutopilotSpecific.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\misc\#AutopilotSpecific.xml# +c:/src/xonline/private/common/config/config/ConfigInstance.cs +c:\src\xonline\private\common\config\config\#ConfigInstance.cs# +c:/src/xonline/private/setup/octopus/xdl/definition/components/inh/Cleanser.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\inh\#Cleanser.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/releases/AutopilotRelease.xml +c:\src\xonline\private\setup\octopus\xdl\definition\releases\#AutopilotRelease.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/topologies/Sandbox.xml +c:\src\xonline\private\setup\octopus\xdl\definition\topologies\#Sandbox.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/frontdoors/Xuacs.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\frontdoors\#Xuacs.xml# +c:/src/xonline/private/server/cleanser/svr/ProjectInstaller.cs +c:\src\xonline\private\server\cleanser\svr\#ProjectInstaller.cs# +c:/src/xonline/private/common/servhlp/ntsvc/ntservice.cpp +c:\src\xonline\private\common\servhlp\ntsvc\#ntservice.cpp# +c:/src/xonline/private/setup/octopus/xdl/sources +c:\src\xonline\private\setup\octopus\xdl\#sources# +c:/src/xonline/private/setup/octopus/xdl/placefile +c:\src\xonline\private\setup\octopus\xdl\#placefile# +c:/src/newcommerce/Tools/APHostsSync/Main/private/src/APHostsSync/start.bat +c:\src\newcommerce\Tools\APHostsSync\Main\private\src\APHostsSync\#start.bat# +c:/src/xonline/private/setup/octopus/xdl/definition/components/misc/ConfigureEnvironmentSpecialization.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\misc\#ConfigureEnvironmentSpecialization.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/misc/CatalogTestData.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\misc\#CatalogTestData.xml# diff --git a/.emacs.d/auto-save-list/.saves-152-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-152-JOHNDOTY-1~ new file mode 100644 index 0000000..cda1cd7 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-152-JOHNDOTY-1~ @@ -0,0 +1,2 @@ +c:/src/commerce/PurchaseService/private/service/purchase/src/receiptstore/webstore/ptst.xml +c:\src\commerce\PurchaseService\private\service\purchase\src\receiptstore\webstore\#ptst.xml# diff --git a/.emacs.d/auto-save-list/.saves-15596-GABRIEL-JD~ b/.emacs.d/auto-save-list/.saves-15596-GABRIEL-JD~ new file mode 100644 index 0000000..8657803 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-15596-GABRIEL-JD~ @@ -0,0 +1,2 @@ +c:/src/iggy/play/combined.dnd40.xml +c:\src\iggy\play\#combined.dnd40.xml# diff --git a/.emacs.d/auto-save-list/.saves-172-JOHNDOTY-IDES~ b/.emacs.d/auto-save-list/.saves-172-JOHNDOTY-IDES~ new file mode 100644 index 0000000..4375421 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-172-JOHNDOTY-IDES~ @@ -0,0 +1,2 @@ +c:/src/oslo/private/developer/JohnDoty/play/SGRW/sgrw.txt +c:\src\oslo\private\developer\JohnDoty\play\SGRW\#sgrw.txt# diff --git a/.emacs.d/auto-save-list/.saves-18888-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-18888-JOHNDOTY-1~ new file mode 100644 index 0000000..faa72b8 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-18888-JOHNDOTY-1~ @@ -0,0 +1,4 @@ +c:/src/oslo/private/Product/QuadrantClient/Quadrant/Microsoft/Quadrant/NewRecordHandlerModule.cs +c:\src\oslo\private\Product\QuadrantClient\Quadrant\Microsoft\Quadrant\#NewRecordHandlerModule.cs# +c:/src/oslo/private/Product/QuadrantClient/Quadrant/Microsoft/Quadrant/ApplicationModule.cs +c:\src\oslo\private\Product\QuadrantClient\Quadrant\Microsoft\Quadrant\#ApplicationModule.cs# diff --git a/.emacs.d/auto-save-list/.saves-1952-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-1952-JOHNDOTY-1~ new file mode 100644 index 0000000..5c917e0 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-1952-JOHNDOTY-1~ @@ -0,0 +1,20 @@ +c:/src/commerce/public/src/xblconfig/dll/XblConfig.csproj +c:\src\commerce\public\src\xblconfig\dll\#XblConfig.csproj# +//determinist/builds/Gated Checkin/Gated Checkin_20110506.2/logs/dirs.log +\\determinist\builds\Gated Checkin\Gated Checkin_20110506.2\logs\#dirs.log# +c:/src/commerce/private/developer/jeffsch/CodeAnalysisBaseline/CodeAnalysisBaseline.csproj +c:\src\commerce\private\developer\jeffsch\CodeAnalysisBaseline\#CodeAnalysisBaseline.csproj# +c:/src/commerce/private/developer/jeffsch/CodeAnalysisBaseline/CodeAnalysisMessageLogger.cs +c:\src\commerce\private\developer\jeffsch\CodeAnalysisBaseline\#CodeAnalysisMessageLogger.cs# +c:/src/commerce/private/developer/jeffsch/CodeAnalysisBaseline/Program.cs +c:\src\commerce\private\developer\jeffsch\CodeAnalysisBaseline\#Program.cs# +c:/tools/x86/fixit.ps1 +c:\tools\x86\#fixit.ps1# +c:/src/commerce/build/xonline/XOnline.targets +c:\src\commerce\build\xonline\#XOnline.targets# +c:/src/commerce/build/zest/Zsvc.Build.targets +c:\src\commerce\build\zest\#Zsvc.Build.targets# +c:/src/commerce/private/service/zest-commerce/src/common-msi/mapping.xml +c:\src\commerce\private\service\zest-commerce\src\common-msi\#mapping.xml# +c:/src/commerce/private/service/zest-commerce/src/common-msi/commondeployment/CommonDeployment.wxs +c:\src\commerce\private\service\zest-commerce\src\common-msi\commondeployment\#CommonDeployment.wxs# diff --git a/.emacs.d/auto-save-list/.saves-2044-BIFROST~ b/.emacs.d/auto-save-list/.saves-2044-BIFROST~ new file mode 100644 index 0000000..abd1989 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-2044-BIFROST~ @@ -0,0 +1,10 @@ +c:/src/iggy/src/igweb/sheet.html +c:\src\iggy\src\igweb\#sheet.html# +c:/Users/John/Desktop/demo.html +c:\Users\John\Desktop\#demo.html# +c:/src/iggy/src/igweb/css/uncompressed/text.css +c:\src\iggy\src\igweb\css\uncompressed\#text.css# +c:/src/iggy/src/igweb/css/sheet.css +c:\src\iggy\src\igweb\css\#sheet.css# +c:/src/iggy/src/igweb/index.html +c:\src\iggy\src\igweb\#index.html# diff --git a/.emacs.d/auto-save-list/.saves-2312-GABRIEL-JD~ b/.emacs.d/auto-save-list/.saves-2312-GABRIEL-JD~ new file mode 100644 index 0000000..e69de29 diff --git a/.emacs.d/auto-save-list/.saves-2396-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-2396-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..f8f7ad0 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-2396-JOHNDOTY-USBOX~ @@ -0,0 +1,42 @@ +z:/src/nt/com/complus/dtc/shared/MtxClu/src/ClusterTmInstance.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#ClusterTmInstance.cpp# +z:/src/nt/com/complus/dtc/dtc/DTCUic/src/securityconfigurationpage.cpp +z:\src\nt\com\complus\dtc\dtc\DTCUic\src\#securityconfigurationpage.cpp# +z:/src/nt/com/complus/dtc/dtc/DTCUic/src/nonclusterglobalpage.cpp +z:\src\nt\com\complus\dtc\dtc\DTCUic\src\#nonclusterglobalpage.cpp# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/ClusterUtil.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#ClusterUtil.cpp# +z:/src/nt/com/complus/dtc/dtc/TM/src/TMTX.CPP +z:\src\nt\com\complus\dtc\dtc\TM\src\#TMTX.CPP# +z:/src/vbl_srv_comtxmq/com/complus/DTC/dtc/TM/inc/TMLOGREC.H +z:\src\vbl_srv_comtxmq\com\complus\DTC\dtc\TM\inc\#TMLOGREC.H# +z:/src/vbl_srv_comtxmq/com/complus/DTC/dtc/TM/src/TMTX.CPP +z:\src\vbl_srv_comtxmq\com\complus\DTC\dtc\TM\src\#TMTX.CPP# +z:/src/nt/com/complus/dtc/dtc/TM/inc/TMTX.H +z:\src\nt\com\complus\dtc\dtc\TM\inc\#TMTX.H# +z:/src/nt/com/complus/dtc/dtc/TM/inc/TMIF.H +z:\src\nt\com\complus\dtc\dtc\TM\inc\#TMIF.H# +z:/src/vbl_srv_comtxmq/com/complus/DTC/dtc/TM/src/TmGatewaySuperior.cpp +z:\src\vbl_srv_comtxmq\com\complus\DTC\dtc\TM\src\#TmGatewaySuperior.cpp# +z:/src/nt/com/complus/dtc/dtc/TM/src/TmLuSuper.Cpp +z:\src\nt\com\complus\dtc\dtc\TM\src\#TmLuSuper.Cpp# +z:/src/nt/com/complus/dtc/inc/DTCCM.H +z:\src\nt\com\complus\dtc\inc\#DTCCM.H# +z:/src/nt/com/complus/dtc/dtc/TM/src/TMINIT.CPP +z:\src\nt\com\complus\dtc\dtc\TM\src\#TMINIT.CPP# +z:/src/nt/com/complus/dtc/dtc/CM/Src/CSOQMGR.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#CSOQMGR.CPP# +z:/src/nt/com/complus/dtc/dtc/CM/Src/CSO.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#CSO.CPP# +z:/src/nt/com/complus/dtc/dtc/CM/Src/CCO.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#CCO.CPP# +z:/src/nt/com/complus/dtc/dtc/CM/Src/IOMGRCLT.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#IOMGRCLT.CPP# +z:/src/nt/com/complus/dtc/dtc/CM/Inc/IPIOMGR.IDL +z:\src\nt\com\complus\dtc\dtc\CM\Inc\#IPIOMGR.IDL# +z:/src/misc/dotx/DoTx.cpp +z:\src\misc\dotx\#DoTx.cpp# +z:/src/vbl_srv_comtxmq/com/complus/DTC/dtc/TM/src/TMBROD.CPP +z:\src\vbl_srv_comtxmq\com\complus\DTC\dtc\TM\src\#TMBROD.CPP# +z:/src/vbl_srv_comtxmq/com/complus/DTC/dtc/TM/src/TmGatewaySubordinate.cpp +z:\src\vbl_srv_comtxmq\com\complus\DTC\dtc\TM\src\#TmGatewaySubordinate.cpp# diff --git a/.emacs.d/auto-save-list/.saves-2440-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-2440-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..19ae588 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-2440-JOHNDOTY-USBOX~ @@ -0,0 +1,14 @@ +z:/src/nt/com/complus/dtc/dtc/CM/Src/IOMGRSRV.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#IOMGRSRV.CPP# +z:/src/nt/com/complus/dtc/dtc/CM/Inc/IOMGR.H +z:\src\nt\com\complus\dtc\dtc\CM\Inc\#IOMGR.H# +z:/src/nt/com/complus/dtc/dtc/Adme/namesvc.cpp +z:\src\nt\com\complus\dtc\dtc\Adme\#namesvc.cpp# +z:/src/nt/com/complus/dtc/dtc/CM/Src/IOMGRRPC.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#IOMGRRPC.CPP# +z:/src/nt/com/complus/dtc/dtc/Adme/namesvc.h +z:\src\nt\com\complus\dtc\dtc\Adme\#namesvc.h# +z:/src/nt/com/complus/dtc/inc/DTCUTIL.H +z:\src\nt\com\complus\dtc\inc\#DTCUTIL.H# +z:/src/nt/com/complus/dtc/dtc/CM/Src/CCO.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#CCO.CPP# diff --git a/.emacs.d/auto-save-list/.saves-2668-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-2668-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..e69de29 diff --git a/.emacs.d/auto-save-list/.saves-2704-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-2704-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..723ea87 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-2704-JOHNDOTY-USBOX~ @@ -0,0 +1,8 @@ +//Tkzaw-pro-18/Mydocs3/JohnDoty/My Documents/My Documents/Protocol Documentation/encoding.txt +\\Tkzaw-pro-18\Mydocs3\JohnDoty\My Documents\My Documents\Protocol Documentation\#encoding.txt# +z:/src/ultra/private/User/dbox/UltraEngineMock/HelloDataflow/HelloDataflow.cs +z:\src\ultra\private\User\dbox\UltraEngineMock\HelloDataflow\#HelloDataflow.cs# +z:/src/ultra/private/User/dbox/Scratch/TxStuff/TxStuff/Program.cs +z:\src\ultra\private\User\dbox\Scratch\TxStuff\TxStuff\#Program.cs# +z:/src/ultra/private/User/dbox/Scratch/OnTheFlySymbols/OnTheFlySymbols/Program.cs +z:\src\ultra\private\User\dbox\Scratch\OnTheFlySymbols\OnTheFlySymbols\#Program.cs# diff --git a/.emacs.d/auto-save-list/.saves-2824-GABRIEL-JD~ b/.emacs.d/auto-save-list/.saves-2824-GABRIEL-JD~ new file mode 100644 index 0000000..9d26e72 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-2824-GABRIEL-JD~ @@ -0,0 +1,8 @@ +c:/src/csa/private/developer/mgudgin/AppDay/Spork/Spork.vba +c:\src\csa\private\developer\mgudgin\AppDay\Spork\#Spork.vba# +c:/src/csa/private/developer/mgudgin/AppDay/DSL/VBA/VBA.mg +c:\src\csa\private\developer\mgudgin\AppDay\DSL\VBA\#VBA.mg# +c:/src/csa/private/developer/mgudgin/AppDay/Spork/names.txt +c:\src\csa\private\developer\mgudgin\AppDay\Spork\#names.txt# +c:/src/csa/private/developer/mgudgin/AppDay/DSL/Input2.vba +c:\src\csa\private\developer\mgudgin\AppDay\DSL\#Input2.vba# diff --git a/.emacs.d/auto-save-list/.saves-2992-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-2992-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..b07a203 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-2992-JOHNDOTY-USBOX~ @@ -0,0 +1,2 @@ +z:/temp/assign.txt +z:\temp\#assign.txt# diff --git a/.emacs.d/auto-save-list/.saves-3032-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-3032-JOHNDOTY-1~ new file mode 100644 index 0000000..56ae53f --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-3032-JOHNDOTY-1~ @@ -0,0 +1,34 @@ +c:/src/xonline/private/setup/octopus/xdl/definition/topologies/Sandbox.xml +c:\src\xonline\private\setup\octopus\xdl\definition\topologies\#Sandbox.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/environments/sandbox.xml +c:\src\xonline\private\setup\octopus\xdl\definition\environments\#sandbox.xml# +c:/src/newcommerce/Tools/xdlc/Main/private/src/xdlc/AutopilotSupport.psm1 +c:\src\newcommerce\Tools\xdlc\Main\private\src\xdlc\#AutopilotSupport.psm1# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/npdb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#npdb.xml# +c:/temp/zomgout/AutoXOnline/sandbox/Acceleration/start.ps1 +c:\temp\zomgout\AutoXOnline\sandbox\Acceleration\#start.ps1# +c:/temp/zomgout/AutoXOnline/sandbox/Acceleration/deploymentprops.ini +c:\temp\zomgout\AutoXOnline\sandbox\Acceleration\#deploymentprops.ini# +c:/src/xonline/private/setup/octopus/xdl/definition/Properties.xml +c:\src\xonline\private\setup\octopus\xdl\definition\#Properties.xml# +c:/src/xonline/private/tools/XblCfg/App/actionServer.cs +c:\src\xonline\private\tools\XblCfg\App\#actionServer.cs# +c:/src/AutopilotService/autopilotService/Co1PPE/xbox-Test-co1ppe/userproperty.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xbox-Test-co1ppe\#userproperty.ini# +c:/src/AutopilotService/autopilotService/Co1PPE/shared/Shared.ini +c:\src\AutopilotService\autopilotService\Co1PPE\shared\#Shared.ini# +c:/src/AutopilotService/autopilotService/Co1PPE/shared/logicaldevices.csv +c:\src\AutopilotService\autopilotService\Co1PPE\shared\#logicaldevices.csv# +c:/src/AutopilotService/autopilotService/Co1PPE/shared/cluster.xml +c:\src\AutopilotService\autopilotService\Co1PPE\shared\#cluster.xml# +c:/src/AutopilotService/autopilotService/Co1PPE/xbox-Test-co1ppe/machines.csv +c:\src\AutopilotService\autopilotService\Co1PPE\xbox-Test-co1ppe\#machines.csv# +c:/src/xonline/private/server/sg/sgarpinfo.cpp +c:\src\xonline\private\server\sg\#sgarpinfo.cpp# +c:/src/xonline/private/server/sg/sgrecv.cpp +c:\src\xonline\private\server\sg\#sgrecv.cpp# +c:/src/xonline/private/server/sg/sgconfig.cpp +c:\src\xonline\private\server\sg\#sgconfig.cpp# +c:/src/xonline/private/server/sg/sources.inc +c:\src\xonline\private\server\sg\#sources.inc# diff --git a/.emacs.d/auto-save-list/.saves-3080-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-3080-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..daf768d --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-3080-JOHNDOTY-USBOX~ @@ -0,0 +1,2 @@ +z:/src/nt/com/complus/dtc/dtc/TM/src/TMINIT.CPP +z:\src\nt\com\complus\dtc\dtc\TM\src\#TMINIT.CPP# diff --git a/.emacs.d/auto-save-list/.saves-31780-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-31780-JOHNDOTY-1~ new file mode 100644 index 0000000..e75c4d2 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-31780-JOHNDOTY-1~ @@ -0,0 +1,8 @@ +c:/src/oslo/private/Product/Framework/Microsoft.M.Language/Microsoft/M/Language/Semantics/IQueryExpression.cs +c:\src\oslo\private\Product\Framework\Microsoft.M.Language\Microsoft\M\Language\Semantics\#IQueryExpression.cs# +c:/src/oslo/private/developer/johndoty/play/mpeg/notes.txt +c:\src\oslo\private\developer\johndoty\play\mpeg\#notes.txt# +c:/src/oslo/private/Product/Framework/Microsoft.M.Language/m.m +c:\src\oslo\private\Product\Framework\Microsoft.M.Language\#m.m# +c:/temp/foo.m +c:\temp\#foo.m# diff --git a/.emacs.d/auto-save-list/.saves-3328-GABRIEL-JD~ b/.emacs.d/auto-save-list/.saves-3328-GABRIEL-JD~ new file mode 100644 index 0000000..6ee1e05 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-3328-GABRIEL-JD~ @@ -0,0 +1,2 @@ +c:/src/Iggy/src/igweb/js/model.js +c:\src\Iggy\src\igweb\js\#model.js# diff --git a/.emacs.d/auto-save-list/.saves-3488-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-3488-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..782f09c --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-3488-JOHNDOTY-USBOX~ @@ -0,0 +1,2 @@ +z:/src/misc/work.cs +z:\src\misc\#work.cs# diff --git a/.emacs.d/auto-save-list/.saves-3536-BIFROST~ b/.emacs.d/auto-save-list/.saves-3536-BIFROST~ new file mode 100644 index 0000000..12e414c --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-3536-BIFROST~ @@ -0,0 +1,4 @@ +c:/src/iggy/src/igweb/sheet.html +c:\src\iggy\src\igweb\#sheet.html# +c:/src/iggy/src/igweb/index.html +c:\src\iggy\src\igweb\#index.html# diff --git a/.emacs.d/auto-save-list/.saves-3540-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-3540-JOHNDOTY-1~ new file mode 100644 index 0000000..4d8cb59 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-3540-JOHNDOTY-1~ @@ -0,0 +1,2 @@ +c:/Windows/System32/drivers/etc/hosts +c:\Windows\System32\drivers\etc\#hosts# diff --git a/.emacs.d/auto-save-list/.saves-3540-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-3540-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..53922d3 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-3540-JOHNDOTY-USBOX~ @@ -0,0 +1,12 @@ +z:/src/nt/com/complus/dtc/dtc/DTCUic/src/transactionlistdialog.cpp +z:\src\nt\com\complus\dtc\dtc\DTCUic\src\#transactionlistdialog.cpp# +z:/src/nt/com/complus/dtc/dtc/DTCUic/inc/transactionlistdialog.h +z:\src\nt\com\complus\dtc\dtc\DTCUic\inc\#transactionlistdialog.h# +z:/src/nt/public/sdk/inc/wtl10/AtlCtrls.h +z:\src\nt\public\sdk\inc\wtl10\#AtlCtrls.h# +z:/src/nt/com/complus/dtc/dtc/DTCUic/src/transactionlistcontrol.cpp +z:\src\nt\com\complus\dtc\dtc\DTCUic\src\#transactionlistcontrol.cpp# +z:/src/nt/public/sdk/inc/wtl10/AtlCtrlx.h +z:\src\nt\public\sdk\inc\wtl10\#AtlCtrlx.h# +z:/src/nt/com/complus/dtc/dtc/MsDtc/Src/MSDTC.CPP +z:\src\nt\com\complus\dtc\dtc\MsDtc\Src\#MSDTC.CPP# diff --git a/.emacs.d/auto-save-list/.saves-3584-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-3584-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..770b00c --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-3584-JOHNDOTY-USBOX~ @@ -0,0 +1,16 @@ +c:/ruby/lib/ruby/gems/1.8/gems/feedtools-0.2.24/db/schema.sqlite.sql +c:\ruby\lib\ruby\gems\1.8\gems\feedtools-0.2.24\db\#schema.sqlite.sql# +c:/ruby/lib/ruby/gems/1.8/gems/feedtools-0.2.24/db/schema.postgresql.sql +c:\ruby\lib\ruby\gems\1.8\gems\feedtools-0.2.24\db\#schema.postgresql.sql# +c:/ruby/lib/ruby/gems/1.8/gems/feedtools-0.2.24/db/schema.mysql.sql +c:\ruby\lib\ruby\gems\1.8\gems\feedtools-0.2.24\db\#schema.mysql.sql# +z:/src/misc/rssfu4/database.yml +z:\src\misc\rssfu4\#database.yml# +z:/src/misc/rssfu4/test1.rb +z:\src\misc\rssfu4\#test1.rb# +c:/Users/johndoty/Desktop/rails_example.rb +c:\Users\johndoty\Desktop\#rails_example.rb# +//cpzaw-pro-05/mydocs1/JohnDoty/.emacs +\\cpzaw-pro-05\mydocs1\JohnDoty\#.emacs# +c:/ruby/lib/ruby-mode.el +c:\ruby\lib\#ruby-mode.el# diff --git a/.emacs.d/auto-save-list/.saves-3724-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-3724-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..09f176f --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-3724-JOHNDOTY-USBOX~ @@ -0,0 +1,2 @@ +z:/src/misc/txobservation.cs +z:\src\misc\#txobservation.cs# diff --git a/.emacs.d/auto-save-list/.saves-3732-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-3732-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..3d0e0cd --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-3732-JOHNDOTY-USBOX~ @@ -0,0 +1,2 @@ +z:/src/nt/com/complus/comres/msdtcprx.rc2 +z:\src\nt\com\complus\comres\#msdtcprx.rc2# diff --git a/.emacs.d/auto-save-list/.saves-3752-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-3752-JOHNDOTY-1~ new file mode 100644 index 0000000..54f3ddc --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-3752-JOHNDOTY-1~ @@ -0,0 +1,2 @@ +c:/src/commerce/private/tools/integrate/sample_mapping.xml +c:\src\commerce\private\tools\integrate\#sample_mapping.xml# diff --git a/.emacs.d/auto-save-list/.saves-3800-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-3800-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..71c4165 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-3800-JOHNDOTY-USBOX~ @@ -0,0 +1,22 @@ +z:/src/ultra/private/Lab/Engine/Microsoft.Dataflow.ReferenceEngine/Microsoft/Dataflow/ReferenceEngine/UpdateManagerImpl.cs +z:\src\ultra\private\Lab\Engine\Microsoft.Dataflow.ReferenceEngine\Microsoft\Dataflow\ReferenceEngine\#UpdateManagerImpl.cs# +z:/src/ultra/private/Lab/Engine/Samples/HelloDataflow/HelloDataflow.cs +z:\src\ultra\private\Lab\Engine\Samples\HelloDataflow\#HelloDataflow.cs# +z:/src/ultra/private/Lab/Engine/System.Dataflow/System/Dataflow/UpdateManager.cs +z:\src\ultra\private\Lab\Engine\System.Dataflow\System\Dataflow\#UpdateManager.cs# +z:/src/ultra/private/Lab/Engine/System.Dataflow/System/Dataflow/Operations.cs +z:\src\ultra\private\Lab\Engine\System.Dataflow\System\Dataflow\#Operations.cs# +z:/src/ultra/private/Lab/Engine/System.Dataflow/System/Dataflow/Operators.cs +z:\src\ultra\private\Lab\Engine\System.Dataflow\System\Dataflow\#Operators.cs# +z:/src/ultra/private/Lab/Engine/Microsoft.Dataflow.ReferenceEngine/Microsoft/Dataflow/ReferenceEngine/LocationImpl.cs +z:\src\ultra\private\Lab\Engine\Microsoft.Dataflow.ReferenceEngine\Microsoft\Dataflow\ReferenceEngine\#LocationImpl.cs# +z:/src/ultra/private/Lab/Engine/Microsoft.Dataflow.ReferenceEngine/Microsoft/Dataflow/ReferenceEngine/BufferManagerImpl.cs +z:\src\ultra\private\Lab\Engine\Microsoft.Dataflow.ReferenceEngine\Microsoft\Dataflow\ReferenceEngine\#BufferManagerImpl.cs# +z:/src/dd/indigo_wap/ndp/indigo/src/Log/System/IO/Log/Error.cs +z:\src\dd\indigo_wap\ndp\indigo\src\Log\System\IO\Log\#Error.cs# +z:/temp/bar.txt +z:\temp\#bar.txt# +z:/src/ultra/private/Users/ckerer/BufferManager/Microsoft.Dataflow.ReferenceEngine/Microsoft/Dataflow/ReferenceEngine/BufferManagerImpl.cs +z:\src\ultra\private\Users\ckerer\BufferManager\Microsoft.Dataflow.ReferenceEngine\Microsoft\Dataflow\ReferenceEngine\#BufferManagerImpl.cs# +z:/src/ultra/private/Users/ckerer/BufferManager/Microsoft.Dataflow.ReferenceEngine/System/Dataflow/Engine/DataflowEngine.cs +z:\src\ultra\private\Users\ckerer\BufferManager\Microsoft.Dataflow.ReferenceEngine\System\Dataflow\Engine\#DataflowEngine.cs# diff --git a/.emacs.d/auto-save-list/.saves-3808-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-3808-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..a519cc5 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-3808-JOHNDOTY-USBOX~ @@ -0,0 +1,32 @@ +z:/temp/protocol/lurecoverybydtc.txt +z:\temp\protocol\#lurecoverybydtc.txt# +z:/src/nt/com/complus/dtc/dtc/TM/src/TmLuRecoveryByDtc.Cpp +z:\src\nt\com\complus\dtc\dtc\TM\src\#TmLuRecoveryByDtc.Cpp# +z:/src/nt/com/complus/dtc/dtc/TM/src/TmLu.Cpp +z:\src\nt\com\complus\dtc\dtc\TM\src\#TmLu.Cpp# +z:/src/nt/com/complus/dtc/inc/txdtc.idl +z:\src\nt\com\complus\dtc\inc\#txdtc.idl# +z:/src/nt/com/complus/dtc/dtc/TM/src/TMLuRmEn.Cpp +z:\src\nt\com\complus\dtc\dtc\TM\src\#TMLuRmEn.Cpp# +z:/src/nt/com/complus/dtc/dtc/Inc/TMMSG.H +z:\src\nt\com\complus\dtc\dtc\Inc\#TMMSG.H# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/LuRecoveryDtcWork.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#LuRecoveryDtcWork.cpp# +z:/src/nt/com/complus/dtc/dtc/TM/src/TMTX.CPP +z:\src\nt\com\complus\dtc\dtc\TM\src\#TMTX.CPP# +z:/src/nt/com/complus/dtc/dtc/TM/inc/TmLu.H +z:\src\nt\com\complus\dtc\dtc\TM\inc\#TmLu.H# +z:/src/nt/com/complus/dtc/dtc/TM/src/TmLuFind.Cpp +z:\src\nt\com\complus\dtc\dtc\TM\src\#TmLuFind.Cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/inc/LuRecovery.h +z:\src\nt\com\complus\dtc\dtc\msdtcprx\inc\#LuRecovery.h# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/inc/LuConfig.h +z:\src\nt\com\complus\dtc\dtc\msdtcprx\inc\#LuConfig.h# +z:/src/nt/com/complus/dtc/dtc/TM/inc/TMBROD.H +z:\src\nt\com\complus\dtc\dtc\TM\inc\#TMBROD.H# +z:/src/nt/com/complus/dtc/dtc/TM/inc/TMIF.H +z:\src\nt\com\complus\dtc\dtc\TM\inc\#TMIF.H# +z:/src/nt/com/complus/dtc/dtc/TM/src/TmLuConfigure.Cpp +z:\src\nt\com\complus\dtc\dtc\TM\src\#TmLuConfigure.Cpp# +z:/src/nt/public/sdk/inc/txdtc.h +z:\src\nt\public\sdk\inc\#txdtc.h# diff --git a/.emacs.d/auto-save-list/.saves-3920-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-3920-JOHNDOTY-1~ new file mode 100644 index 0000000..eb5d07c --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-3920-JOHNDOTY-1~ @@ -0,0 +1,2 @@ +c:/src/AutopilotService/autopilotService/Co1PPE/xbox-Test-co1ppe/deployment.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xbox-Test-co1ppe\#deployment.ini# diff --git a/.emacs.d/auto-save-list/.saves-4036-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-4036-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..12305df --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-4036-JOHNDOTY-USBOX~ @@ -0,0 +1,64 @@ +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/dtcinit.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#dtcinit.cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/inc/dtcinit.h +z:\src\nt\com\complus\dtc\dtc\msdtcprx\inc\#dtcinit.h# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/dtcnaconfig.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#dtcnaconfig.cpp# +z:/src/nt/com/complus/dtc/dtc/CM/Src/CCM.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#CCM.CPP# +z:/src/nt/com/complus/dtc/dtc/CM/Src/cmsettings.cpp +z:\src\nt\com\complus\dtc\dtc\CM\Src\#cmsettings.cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/inc/msdtcprx.idl +z:\src\nt\com\complus\dtc\dtc\msdtcprx\inc\#msdtcprx.idl# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/dtcprx.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#dtcprx.cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/inc/dtcprx.h +z:\src\nt\com\complus\dtc\dtc\msdtcprx\inc\#dtcprx.h# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/DllGetTmCore.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#DllGetTmCore.cpp# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/ClusterUtil.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#ClusterUtil.cpp# +z:/src/nt/com/complus/dtc/inc/ClusterUtil.h +z:\src\nt\com\complus\dtc\inc\#ClusterUtil.h# +z:/src/nt/com/complus/dtc/inc/ClusterUtilBasic.h +z:\src\nt\com\complus\dtc\inc\#ClusterUtilBasic.h# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/ClusterTmInstance.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#ClusterTmInstance.cpp# +z:/src/nt/com/complus/dtc/dtc/DTCUic/src/nonclusterglobalpage.cpp +z:\src\nt\com\complus\dtc\dtc\DTCUic\src\#nonclusterglobalpage.cpp# +z:/src/nt/com/complus/dtc/shared/Util/clusterutilbasic.cpp +z:\src\nt\com\complus\dtc\shared\Util\#clusterutilbasic.cpp# +z:/src/nt/com/complus/dtc/dtc/DTCUic/src/tminstancenode.cpp +z:\src\nt\com\complus\dtc\dtc\DTCUic\src\#tminstancenode.cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/msdtcprx.def +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#msdtcprx.def# +z:/src/nt/com/complus/dtc/dtc/Adme/NonClusterTmInstance.cpp +z:\src\nt\com\complus\dtc\dtc\Adme\#NonClusterTmInstance.cpp# +z:/src/nt/com/complus/dtc/inc/TMINSTANCE.H +z:\src\nt\com\complus\dtc\inc\#TMINSTANCE.H# +z:/src/nt/com/complus/dtc/dtc/CM/Src/CSO.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#CSO.CPP# +z:/src/nt/com/complus/dtc/dtc/Inc/deployment.h +z:\src\nt\com\complus\dtc\dtc\Inc\#deployment.h# +z:/src/nt/com/complus/dtc/dtc/Adme/deployment.cpp +z:\src\nt\com\complus\dtc\dtc\Adme\#deployment.cpp# +z:/src/nt/com/complus/dtc/dtc/Adme/NonClusterTmInstance.h +z:\src\nt\com\complus\dtc\dtc\Adme\#NonClusterTmInstance.h# +z:/src/nt/com/complus/dtc/shared/Util/cr_c.cpp +z:\src\nt\com\complus\dtc\shared\Util\#cr_c.cpp# +z:/src/nt/com/complus/dtc/dtc/Adme/crf_clcrf.cpp +z:\src\nt\com\complus\dtc\dtc\Adme\#crf_clcrf.cpp# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/DtcResource.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#DtcResource.cpp# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/DtcResourceUtil.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#DtcResourceUtil.cpp# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/ClusterServiceAccount.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#ClusterServiceAccount.cpp# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/ClusterHelper.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#ClusterHelper.cpp# +z:/src/nt/com/complus/dtc/dtc/CMHelper/cmhelper.cpp +z:\src\nt\com\complus\dtc\dtc\CMHelper\#cmhelper.cpp# +z:/src/nt/com/complus/dtc/dtc/DTCUic/src/uiclient.cpp +z:\src\nt\com\complus\dtc\dtc\DTCUic\src\#uiclient.cpp# +z:/src/nt/com/complus/dtc/dtc/CM/Src/CCO.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#CCO.CPP# diff --git a/.emacs.d/auto-save-list/.saves-4076-GABRIEL-JD~ b/.emacs.d/auto-save-list/.saves-4076-GABRIEL-JD~ new file mode 100644 index 0000000..67a8392 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-4076-GABRIEL-JD~ @@ -0,0 +1,2 @@ +c:/Users/JohnDoty/Desktop/SecondLayer.txt +c:\Users\JohnDoty\Desktop\#SecondLayer.txt# diff --git a/.emacs.d/auto-save-list/.saves-4084-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-4084-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..e69de29 diff --git a/.emacs.d/auto-save-list/.saves-4172-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-4172-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..5bb5386 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-4172-JOHNDOTY-USBOX~ @@ -0,0 +1,40 @@ +z:/src/nt/com/complus/dtc/shared/Util/vssbackup.cpp +z:\src\nt\com\complus\dtc\shared\Util\#vssbackup.cpp# +z:/src/nt/com/complus/dtc/inc/vssbackup.h +z:\src\nt\com\complus\dtc\inc\#vssbackup.h# +z:/src/nt/com/complus/dtc/inc/msdtcsddl.h +z:\src\nt\com\complus\dtc\inc\#msdtcsddl.h# +z:/src/nt/com/complus/dtc/dtc/DTCUic/src/nonclusterglobalpage.cpp +z:\src\nt\com\complus\dtc\dtc\DTCUic\src\#nonclusterglobalpage.cpp# +z:/src/nt/public/sdk/inc/sddl.h +z:\src\nt\public\sdk\inc\#sddl.h# +z:/src/nt/com/complus/manifests/Microsoft.Windows.COM.DTC.Runtime.man +z:\src\nt\com\complus\manifests\#Microsoft.Windows.COM.DTC.Runtime.man# +z:/src/nt/public/sdk/inc/security.h +z:\src\nt\public\sdk\inc\#security.h# +z:/src/nt/com/complus/dtc/inc/msdtcsecurity.h +z:\src\nt\com\complus\dtc\inc\#msdtcsecurity.h# +z:/src/nt/com/complus/dtc/inc/dtcsecurity.h +z:\src\nt\com\complus\dtc\inc\#dtcsecurity.h# +z:/src/nt/com/complus/dtc/shared/Util/msdtcsecurity.cpp +z:\src\nt\com\complus\dtc\shared\Util\#msdtcsecurity.cpp# +z:/src/nt/com/complus/manifests/Microsoft.Windows.COM.DTC.Setup.man +z:\src\nt\com\complus\manifests\#Microsoft.Windows.COM.DTC.Setup.man# +z:/src/nt/com/complus/manifests/Microsoft.Windows.COM.DTC.Client.man +z:\src\nt\com\complus\manifests\#Microsoft.Windows.COM.DTC.Client.man# +z:/src/nt/base/cluster/resdll/gensvc/gensvc.c +z:\src\nt\base\cluster\resdll\gensvc\#gensvc.c# +z:/src/nt/base/cluster/resdll/genscript/genscript.cpp +z:\src\nt\base\cluster\resdll\genscript\#genscript.cpp# +z:/src/nt/base/cluster/resdll/genscript/ScriptResource.cpp +z:\src\nt\base\cluster\resdll\genscript\#ScriptResource.cpp# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/DtcResource.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#DtcResource.cpp# +z:/src/nt/com/complus/dtc/dtc/CM/Src/IOMGRSRV.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#IOMGRSRV.CPP# +z:/src/nt/com/complus/dtc/dtc/CM/Inc/IOMGR.H +z:\src\nt\com\complus\dtc\dtc\CM\Inc\#IOMGR.H# +z:/src/nt/com/complus/dtc/dtc/TipGW/commgr/src/commgrconn.cpp +z:\src\nt\com\complus\dtc\dtc\TipGW\commgr\src\#commgrconn.cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/connpt.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#connpt.cpp# diff --git a/.emacs.d/auto-save-list/.saves-4184-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-4184-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..82c9197 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-4184-JOHNDOTY-USBOX~ @@ -0,0 +1,2 @@ +z:/src/misc/observer.cs +z:\src\misc\#observer.cs# diff --git a/.emacs.d/auto-save-list/.saves-4276-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-4276-JOHNDOTY-1~ new file mode 100644 index 0000000..5f0b919 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-4276-JOHNDOTY-1~ @@ -0,0 +1,26 @@ +c:/src/commerce/private/service/xsuppapi/src/xsuppapi/xsuppapi.csproj +c:\src\commerce\private\service\xsuppapi\src\xsuppapi\#xsuppapi.csproj# +c:/src/commerce/build/xonline/XOnline.targets +c:\src\commerce\build\xonline\#XOnline.targets# +c:/src/xonline/build/xluse.targets +c:\src\xonline\build\#xluse.targets# +c:/src/commerce/public/src/tools/TagRecycle/lib/TagRecycleLib.csproj +c:\src\commerce\public\src\tools\TagRecycle\lib\#TagRecycleLib.csproj# +c:/src/commerce/build/xonline/Microsoft.Build.settings +c:\src\commerce\build\xonline\#Microsoft.Build.settings# +c:/src/commerce/build/xonline/Product.Build.settings +c:\src\commerce\build\xonline\#Product.Build.settings# +c:/tools/x86/fixit.ps1 +c:\tools\x86\#fixit.ps1# +c:/src/commerce/private/service/zest-commerce/test/bllcommerce-unittests/bllcommerce-unittests.csproj +c:\src\commerce\private\service\zest-commerce\test\bllcommerce-unittests\#bllcommerce-unittests.csproj# +c:/src/commerce/public/src/livecache/client/xonline.common.webplatform.livecache.csproj +c:\src\commerce\public\src\livecache\client\#xonline.common.webplatform.livecache.csproj# +c:/src/commerce/public/src/xblcore/dll/XblCore.csproj +c:\src\commerce\public\src\xblcore\dll\#XblCore.csproj# +c:/src/commerce/private/service/zest-commerce/src/dalcommerce/dalcommerce.csproj +c:\src\commerce\private\service\zest-commerce\src\dalcommerce\#dalcommerce.csproj# +c:/src/commerce/public/src/clientcatalog/clientcatalog.csproj +c:\src\commerce\public\src\clientcatalog\#clientcatalog.csproj# +c:/src/commerce/private/developer/johndoty/integrate_settings.ps1 +c:\src\commerce\private\developer\johndoty\#integrate_settings.ps1# diff --git a/.emacs.d/auto-save-list/.saves-4284-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-4284-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..f57c733 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-4284-JOHNDOTY-USBOX~ @@ -0,0 +1,28 @@ +z:/src/nt/com/complus/dtc/dtc/TM/src/TmLu.Cpp +z:\src\nt\com\complus\dtc\dtc\TM\src\#TmLu.Cpp# +z:/src/nt/com/complus/dtc/dtc/TM/src/TmLuFind.Cpp +z:\src\nt\com\complus\dtc\dtc\TM\src\#TmLuFind.Cpp# +z:/src/nt/com/complus/dtc/dtc/TM/src/TMLuRmEn.Cpp +z:\src\nt\com\complus\dtc\dtc\TM\src\#TMLuRmEn.Cpp# +z:/temp/protocol/lurecoverybydtc.txt +z:\temp\protocol\#lurecoverybydtc.txt# +z:/src/nt/com/complus/dtc/dtc/TM/src/TmLuSuper.Cpp +z:\src\nt\com\complus\dtc\dtc\TM\src\#TmLuSuper.Cpp# +z:/src/nt/com/complus/dtc/dtc/TM/src/TmLuRecoveryByDtc.Cpp +z:\src\nt\com\complus\dtc\dtc\TM\src\#TmLuRecoveryByDtc.Cpp# +z:/temp/protocol/lurmenlistment.txt +z:\temp\protocol\#lurmenlistment.txt# +z:/temp/protocol/lurecovery.txt +z:\temp\protocol\#lurecovery.txt# +z:/temp/protocol/luconfigure.txt +z:\temp\protocol\#luconfigure.txt# +z:/src/nt/com/complus/dtc/dtc/TM/src/TmLuRecov.Cpp +z:\src\nt\com\complus\dtc\dtc\TM\src\#TmLuRecov.Cpp# +z:/src/nt/com/complus/dtc/dtc/TM/inc/TmLu.H +z:\src\nt\com\complus\dtc\dtc\TM\inc\#TmLu.H# +//cpzaw-pro-05/mydocs1/JohnDoty/.emacs +\\cpzaw-pro-05\mydocs1\JohnDoty\#.emacs# +z:/temp/foo.cpp +z:\temp\#foo.cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/dtcprxtx.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#dtcprxtx.cpp# diff --git a/.emacs.d/auto-save-list/.saves-4448-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-4448-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..c26d9f8 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-4448-JOHNDOTY-USBOX~ @@ -0,0 +1,12 @@ +//cpzaw-pro-05/mydocs1/JohnDoty/My Documents/Protocol Documentation/Unfinished/tipproxygateway.txt +\\cpzaw-pro-05\mydocs1\JohnDoty\My Documents\Protocol Documentation\Unfinished\#tipproxygateway.txt# +z:/src/nt/com/complus/dtc/dtc/TM/src/tmsuper.cpp +z:\src\nt\com\complus\dtc\dtc\TM\src\#tmsuper.cpp# +z:/src/nt/com/complus/dtc/dtc/TM/inc/tmsupif.h +z:\src\nt\com\complus\dtc\dtc\TM\inc\#tmsupif.h# +z:/src/nt/com/complus/dtc/dtc/TM/inc/tmsuper.h +z:\src\nt\com\complus\dtc\dtc\TM\inc\#tmsuper.h# +z:/src/nt/com/complus/dtc/dtc/Inc/TMMSG.H +z:\src\nt\com\complus\dtc\dtc\Inc\#TMMSG.H# +z:/src/misc/sm.cs +z:\src\misc\#sm.cs# diff --git a/.emacs.d/auto-save-list/.saves-4452-GABRIEL-JD~ b/.emacs.d/auto-save-list/.saves-4452-GABRIEL-JD~ new file mode 100644 index 0000000..6e59c81 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-4452-GABRIEL-JD~ @@ -0,0 +1,4 @@ +c:/src/Iggy/src/igweb/js/model.js +c:\src\Iggy\src\igweb\js\#model.js# +c:/src/Iggy/src/igweb/test/modeltests.js +c:\src\Iggy\src\igweb\test\#modeltests.js# diff --git a/.emacs.d/auto-save-list/.saves-4504-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-4504-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..9ad2afa --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-4504-JOHNDOTY-USBOX~ @@ -0,0 +1,10 @@ +//cpzaw-pro-05/mydocs1/JohnDoty/My Documents/Protocol Documentation/Unfinished/lurecoverybylu.txt +\\cpzaw-pro-05\mydocs1\JohnDoty\My Documents\Protocol Documentation\Unfinished\#lurecoverybylu.txt# +z:/src/nt/com/complus/dtc/dtc/TM/src/TmLuRecoveryByLu.Cpp +z:\src\nt\com\complus\dtc\dtc\TM\src\#TmLuRecoveryByLu.Cpp# +z:/src/nt/com/complus/dtc/inc/txdtc.idl +z:\src\nt\com\complus\dtc\inc\#txdtc.idl# +//cpzaw-pro-05/mydocs1/JohnDoty/My Documents/Protocol Documentation/Unsubmitted/lurecoverybydtc.txt +\\cpzaw-pro-05\mydocs1\JohnDoty\My Documents\Protocol Documentation\Unsubmitted\#lurecoverybydtc.txt# +//cpzaw-pro-05/mydocs1/JohnDoty/My Documents/Protocol Documentation/luconfigure.txt +\\cpzaw-pro-05\mydocs1\JohnDoty\My Documents\Protocol Documentation\#luconfigure.txt# diff --git a/.emacs.d/auto-save-list/.saves-4576-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-4576-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..35c204f --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-4576-JOHNDOTY-USBOX~ @@ -0,0 +1,36 @@ +//cpzaw-pro-05/mydocs1/JohnDoty/.emacs +\\cpzaw-pro-05\mydocs1\JohnDoty\#.emacs# +z:/src/misc/rssfu/Engine/Feed.cs +z:\src\misc\rssfu\Engine\#Feed.cs# +z:/src/nt/com/complus/dtc/dtc/Inc/TMMSG.H +z:\src\nt\com\complus\dtc\dtc\Inc\#TMMSG.H# +//cpzaw-pro-05/mydocs1/JohnDoty/My Documents/Protocol Documentation/Unfinished/luinfo.txt +\\cpzaw-pro-05\mydocs1\JohnDoty\My Documents\Protocol Documentation\Unfinished\#luinfo.txt# +//cpzaw-pro-05/mydocs1/JohnDoty/My Documents/Protocol Documentation/Unsubmitted/lurmenlistment.txt +\\cpzaw-pro-05\mydocs1\JohnDoty\My Documents\Protocol Documentation\Unsubmitted\#lurmenlistment.txt# +z:/src/nt/com/complus/dtc/dtc/TM/src/TmLuSuper.Cpp +z:\src\nt\com\complus\dtc\dtc\TM\src\#TmLuSuper.Cpp# +z:/src/nt/com/complus/dtc/dtc/TM/src/TMTX.CPP +z:\src\nt\com\complus\dtc\dtc\TM\src\#TMTX.CPP# +z:/src/nt/com/complus/dtc/dtc/TM/src/TmLuFind.Cpp +z:\src\nt\com\complus\dtc\dtc\TM\src\#TmLuFind.Cpp# +z:/src/nt/com/complus/dtc/dtc/TM/src/TMLuRmEn.Cpp +z:\src\nt\com\complus\dtc\dtc\TM\src\#TMLuRmEn.Cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/LuRmEnlist.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#LuRmEnlist.cpp# +z:/src/nt/com/complus/dtc/dtc/TM/inc/TmLuSuper.H +z:\src\nt\com\complus\dtc\dtc\TM\inc\#TmLuSuper.H# +z:/src/nt/com/complus/dtc/dtc/TM/inc/tmsuptem.h +z:\src\nt\com\complus\dtc\dtc\TM\inc\#tmsuptem.h# +z:/src/nt/com/complus/dtc/dtc/TM/inc/tmsupif.h +z:\src\nt\com\complus\dtc\dtc\TM\inc\#tmsupif.h# +z:/src/nt/com/complus/dtc/dtc/TM/src/TMINIT.CPP +z:\src\nt\com\complus\dtc\dtc\TM\src\#TMINIT.CPP# +//cpzaw-pro-05/mydocs1/JohnDoty/My Documents/Protocol Documentation/Unsubmitted/lurecoverybydtc.txt +\\cpzaw-pro-05\mydocs1\JohnDoty\My Documents\Protocol Documentation\Unsubmitted\#lurecoverybydtc.txt# +z:/src/nt/com/complus/dtc/inc/txdtc.idl +z:\src\nt\com\complus\dtc\inc\#txdtc.idl# +z:/src/nt/com/complus/dtc/dtc/TM/inc/tmresif.h +z:\src\nt\com\complus\dtc\dtc\TM\inc\#tmresif.h# +z:/src/nt/com/complus/dtc/dtc/TM/src/TmLuRecoveryByLu.Cpp +z:\src\nt\com\complus\dtc\dtc\TM\src\#TmLuRecoveryByLu.Cpp# diff --git a/.emacs.d/auto-save-list/.saves-4608-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-4608-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..c1ac17d --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-4608-JOHNDOTY-USBOX~ @@ -0,0 +1,16 @@ +z:/temp/assign.txt +z:\temp\#assign.txt# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/ClusterTmInstance.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#ClusterTmInstance.cpp# +z:/src/nt/com/complus/dtc/dtc/MsDtc/Src/InitBridge.cpp +z:\src\nt\com\complus\dtc\dtc\MsDtc\Src\#InitBridge.cpp# +z:/src/nt/com/complus/dtc/shared/Util/basetminstance.cpp +z:\src\nt\com\complus\dtc\shared\Util\#basetminstance.cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/xamapper.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#xamapper.cpp# +z:/src/nt/com/complus/dtc/inc/UIMSG.H +z:\src\nt\com\complus\dtc\inc\#UIMSG.H# +z:/src/xpsp2/com/com1x/DTC/dtc/MsDtcPrx/src/voter.cpp +z:\src\xpsp2\com\com1x\DTC\dtc\MsDtcPrx\src\#voter.cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/VoteAggregator.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#VoteAggregator.cpp# diff --git a/.emacs.d/auto-save-list/.saves-4628-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-4628-JOHNDOTY-1~ new file mode 100644 index 0000000..d7d4591 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-4628-JOHNDOTY-1~ @@ -0,0 +1,2 @@ +c:/src/misc/foo.txt +c:\src\misc\#foo.txt# diff --git a/.emacs.d/auto-save-list/.saves-4708-BIFROST~ b/.emacs.d/auto-save-list/.saves-4708-BIFROST~ new file mode 100644 index 0000000..576fe54 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-4708-BIFROST~ @@ -0,0 +1,4 @@ +c:/src/misc/tracking.html +c:\src\misc\#tracking.html# +c:/temp/notes.txt +c:\temp\#notes.txt# diff --git a/.emacs.d/auto-save-list/.saves-4728-JOHNDOTY-IDES~ b/.emacs.d/auto-save-list/.saves-4728-JOHNDOTY-IDES~ new file mode 100644 index 0000000..3f7c0a8 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-4728-JOHNDOTY-IDES~ @@ -0,0 +1,10 @@ +c:/users/johndoty/documents/WindowsPowerShell/Modules/VSProject/VSProject.ps1 +c:\users\johndoty\documents\WindowsPowerShell\Modules\VSProject\#VSProject.ps1# +c:/src/oslo/private/tools/slngen/ProjectInfo.cs +c:\src\oslo\private\tools\slngen\#ProjectInfo.cs# +c:/src/oslo/private/tools/slngen/ProjectClosure.cs +c:\src\oslo\private\tools\slngen\#ProjectClosure.cs# +c:/src/oslo/private/developer/JohnDoty/build/userenv.ps1 +c:\src\oslo\private\developer\JohnDoty\build\#userenv.ps1# +c:/users/johndoty/documents/site-lisp/powershell-mode.el +c:\users\johndoty\documents\site-lisp\#powershell-mode.el# diff --git a/.emacs.d/auto-save-list/.saves-4728-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-4728-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..6af5663 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-4728-JOHNDOTY-USBOX~ @@ -0,0 +1,16 @@ +z:/src/nt/com/complus/dtc/shared/Util/security.cpp +z:\src\nt\com\complus\dtc\shared\Util\#security.cpp# +z:/src/nt/com/complus/dtc/inc/dtcsecurity.h +z:\src\nt\com\complus\dtc\inc\#dtcsecurity.h# +z:/src/nt/com/complus/dtc/inc/DTC.H +z:\src\nt\com\complus\dtc\inc\#DTC.H# +z:/src/nt/com/complus/dtc/dtc/Inc/DtcErrorLoggingHelper.h +z:\src\nt\com\complus\dtc\dtc\Inc\#DtcErrorLoggingHelper.h# +z:/src/nt/com/complus/dtc/dtc/CM/Src/CSO.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#CSO.CPP# +z:/src/nt/com/complus/dtc/dtc/CM/Src/CCM.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#CCM.CPP# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/dtcinit.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#dtcinit.cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/inc/dtcprxcn.h +z:\src\nt\com\complus\dtc\dtc\msdtcprx\inc\#dtcprxcn.h# diff --git a/.emacs.d/auto-save-list/.saves-4780-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-4780-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..b5a5dac --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-4780-JOHNDOTY-USBOX~ @@ -0,0 +1,2 @@ +z:/src/misc/foo.cs +z:\src\misc\#foo.cs# diff --git a/.emacs.d/auto-save-list/.saves-4936-BIFROST~ b/.emacs.d/auto-save-list/.saves-4936-BIFROST~ new file mode 100644 index 0000000..72d5df0 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-4936-BIFROST~ @@ -0,0 +1,2 @@ +f:/src/littleserver/.gitignore +f:\src\littleserver\#.gitignore# diff --git a/.emacs.d/auto-save-list/.saves-4944-GABRIEL-JD~ b/.emacs.d/auto-save-list/.saves-4944-GABRIEL-JD~ new file mode 100644 index 0000000..f4387d8 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-4944-GABRIEL-JD~ @@ -0,0 +1,2 @@ +c:/temp/rewrite.m +c:\temp\#rewrite.m# diff --git a/.emacs.d/auto-save-list/.saves-4952-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-4952-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..554a790 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-4952-JOHNDOTY-USBOX~ @@ -0,0 +1,172 @@ +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/editbot.cs +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\#editbot.cs# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_dtclurecoveryinitiatedbydtc/txuser_dtclurecoveryinitiatedbydtc_mtag_comparestates_info.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_dtclurecoveryinitiatedbydtc\#txuser_dtclurecoveryinitiatedbydtc_mtag_comparestates_info.xml# +c:/Users/JohnDoty/Desktop/conntype_partnertm_checkabort.xml +c:\Users\JohnDoty\Desktop\#conntype_partnertm_checkabort.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/log.txt +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\#log.txt# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_export/txuser_export_mtag_create.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_export\#txuser_export_mtag_create.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_getsecurityflags/TXUSER_GETSECURITYFLAGS_MTAG_GETSECURITYFLAGS.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_getsecurityflags\#TXUSER_GETSECURITYFLAGS_MTAG_GETSECURITYFLAGS.xml# +//Tkzaw-pro-18/Mydocs3/JohnDoty/My Documents/.emacs +\\Tkzaw-pro-18\Mydocs3\JohnDoty\My Documents\#.emacs# +c:/Users/JohnDoty/Desktop/nxml/nxml-mode-20041004/README +c:\Users\JohnDoty\Desktop\nxml\nxml-mode-20041004\#README# +//Tkzaw-pro-18/Mydocs3/JohnDoty/My Documents/site-lisp/sgml-mode.el +\\Tkzaw-pro-18\Mydocs3\JohnDoty\My Documents\site-lisp\#sgml-mode.el# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_xauser_xact_start/xauser_xact_mtag_start.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_xauser_xact_start\#xauser_xact_mtag_start.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_import/txuser_import_mtag_imported.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_import\#txuser_import_mtag_imported.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/conntype_xauser_start.txt +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\#conntype_xauser_start.txt# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_xatm_enlist/xatmuser_mtag_enlist.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_xatm_enlist\#xatmuser_mtag_enlist.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/crack.cs +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\#crack.cs# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_dtcluconfigure/txuser_dtclurmconfigure_mtag_add.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_dtcluconfigure\#txuser_dtclurmconfigure_mtag_add.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_associate/txuser_associate_mtag_associate.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_associate\#txuser_associate_mtag_associate.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_xauser_xact_open/xauser_xact_mtag_open.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_xauser_xact_open\#xauser_xact_mtag_open.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_xauser_xact_migrate/XAUSER_XACT_MTAG_SUSPEND_WITH_MIGRATE.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_xauser_xact_migrate\#XAUSER_XACT_MTAG_SUSPEND_WITH_MIGRATE.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_xauser_xact_migrate/XAUSER_XACT_MTAG_RESUME.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_xauser_xact_migrate\#XAUSER_XACT_MTAG_RESUME.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_xatm_open/xatmuser_mtag_rmopenok.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_xatm_open\#xatmuser_mtag_rmopenok.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_xatm_open/xatmuser_mtag_rmopen.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_xatm_open\#xatmuser_mtag_rmopen.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_xatm_open/xatmuser_mtag_e_rmprotocol.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_xatm_open\#xatmuser_mtag_e_rmprotocol.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_xatm_open/xatmuser_mtag_e_rmopenfailed.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_xatm_open\#xatmuser_mtag_e_rmopenfailed.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_xatm_open/xatmuser_mtag_e_rmnotavailable.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_xatm_open\#xatmuser_mtag_e_rmnotavailable.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_xatm_open/xatmuser_mtag_e_rmnonexistent.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_xatm_open\#xatmuser_mtag_e_rmnonexistent.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_xatm_open/xatmuser_mtag_e_rmfailedrecovery.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_xatm_open\#xatmuser_mtag_e_rmfailedrecovery.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_xatm_open/xatmuser_mtag_e_configlogwritefailed.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_xatm_open\#xatmuser_mtag_e_configlogwritefailed.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_partnertm_checkabort/partnertm_checkabort_mtag_check.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_partnertm_checkabort\#partnertm_checkabort_mtag_check.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_xauser_xact_migrate/template.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_xauser_xact_migrate\#template.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_import/txuser_import_mtag_abort.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_import\#txuser_import_mtag_abort.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_dtclurmenlistment/txuser_dtclurmenlistment_mtag_create.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_dtclurmenlistment\#txuser_dtclurmenlistment_mtag_create.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_gettxdetails/txuser_gettxdetails_mtag_gotit.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_gettxdetails\#txuser_gettxdetails_mtag_gotit.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/CONNTYPE_TXUSER_SNAPSHOT_FREEZE.txt +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\#CONNTYPE_TXUSER_SNAPSHOT_FREEZE.txt# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/conntype_txuser_status.txt +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\#conntype_txuser_status.txt# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/CONNTYPE_TXUSER_TRACE.txt +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\#CONNTYPE_TXUSER_TRACE.txt# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/CONNTYPE_PARTNERTM_REDELIVERCOMMIT.txt +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\#CONNTYPE_PARTNERTM_REDELIVERCOMMIT.txt# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/CONNTYPE_TXUSER_RESOLVE.txt +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\#CONNTYPE_TXUSER_RESOLVE.txt# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/CONNTYPE_TXUSER_ASSOCIATE.txt +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\#CONNTYPE_TXUSER_ASSOCIATE.txt# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_dtclurecoveryinitiatedbydtc/txuser_dtclurecoveryinitiatedbydtc_mtag_work_trans.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_dtclurecoveryinitiatedbydtc\#txuser_dtclurecoveryinitiatedbydtc_mtag_work_trans.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_dtclurecoveryinitiatedbylu/txuser_dtclurecoveryinitiatedbylu_mtag_their_xln.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_dtclurecoveryinitiatedbylu\#txuser_dtclurecoveryinitiatedbylu_mtag_their_xln.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_dtclurecoveryinitiatedbylu/txuser_dtclurecoveryinitiatedbylu_mtag_response_for_their_xln.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_dtclurecoveryinitiatedbylu\#txuser_dtclurecoveryinitiatedbylu_mtag_response_for_their_xln.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_dtclurecoveryinitiatedbydtc/txuser_dtclurecoveryinitiatedbydtc_mtag_their_xln_response.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_dtclurecoveryinitiatedbydtc\#txuser_dtclurecoveryinitiatedbydtc_mtag_their_xln_response.xml# +z:/src/nt/com/complus/dtc/inc/txdtc.idl +z:\src\nt\com\complus\dtc\inc\#txdtc.idl# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_dtclurecoveryinitiatedbylu/txuser_dtclurecoveryinitiatedbylu_mtag_response_for_their_comparestates.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_dtclurecoveryinitiatedbylu\#txuser_dtclurecoveryinitiatedbylu_mtag_response_for_their_comparestates.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_dtclurecoveryinitiatedbydtc/txuser_dtclurecoveryinitiatedbydtc_mtag_error_from_our_xln.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_dtclurecoveryinitiatedbydtc\#txuser_dtclurecoveryinitiatedbydtc_mtag_error_from_our_xln.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_dtclurecoveryinitiatedbylu/txuser_dtclurecoveryinitiatedbylu_mtag_error_of_our_comparestates.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_dtclurecoveryinitiatedbylu\#txuser_dtclurecoveryinitiatedbylu_mtag_error_of_our_comparestates.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_dtclurecoveryinitiatedbydtc/txuser_dtclurecoveryinitiatedbydtc_mtag_error_from_our_comparestates.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_dtclurecoveryinitiatedbydtc\#txuser_dtclurecoveryinitiatedbydtc_mtag_error_from_our_comparestates.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_dtclurecoveryinitiatedbylu/txuser_dtclurecoveryinitiatedbylu_mtag_confirmation_of_our_xln.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_dtclurecoveryinitiatedbylu\#txuser_dtclurecoveryinitiatedbylu_mtag_confirmation_of_our_xln.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_dtclurecoveryinitiatedbydtc/txuser_dtclurecoveryinitiatedbydtc_mtag_confirmation_from_our_xln.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_dtclurecoveryinitiatedbydtc\#txuser_dtclurecoveryinitiatedbydtc_mtag_confirmation_from_our_xln.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_dtclurecoveryinitiatedbydtc/txuser_dtclurecoveryinitiatedbydtc_mtag_confirmation_for_their_xln.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_dtclurecoveryinitiatedbydtc\#txuser_dtclurecoveryinitiatedbydtc_mtag_confirmation_for_their_xln.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_dtclurecoveryinitiatedbylu/txuser_dtclurecoveryinitiatedbylu_mtag_confirmation_of_our_comparestates.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_dtclurecoveryinitiatedbylu\#txuser_dtclurecoveryinitiatedbylu_mtag_confirmation_of_our_comparestates.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_dtclurecoveryinitiatedbydtc/txuser_dtclurecoveryinitiatedbydtc_mtag_confirmation_for_their_comparestates.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_dtclurecoveryinitiatedbydtc\#txuser_dtclurecoveryinitiatedbydtc_mtag_confirmation_for_their_comparestates.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_dtclurecoveryinitiatedbydtc/txuser_dtclurecoveryinitiatedbydtc_mtag_their_comparestates.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_dtclurecoveryinitiatedbydtc\#txuser_dtclurecoveryinitiatedbydtc_mtag_their_comparestates.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_dtclurecoveryinitiatedbylu/txuser_dtclurecoveryinitiatedbylu_mtag_their_comparestates.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_dtclurecoveryinitiatedbylu\#txuser_dtclurecoveryinitiatedbylu_mtag_their_comparestates.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/conntype_xauser_control.txt +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\#conntype_xauser_control.txt# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/CONNTYPE_TXUSER_DTCLUSUBORDINATEDTC.txt +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\#CONNTYPE_TXUSER_DTCLUSUBORDINATEDTC.txt# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/TransactionState.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#TransactionState.cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/dtcprx.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#dtcprx.cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/dtcprxtx.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#dtcprxtx.cpp# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/Schema/struct_v2.dtd +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\Schema\#struct_v2.dtd# +c:/Users/JohnDoty/Desktop/Missing oletx info.txt +c:\Users\JohnDoty\Desktop\#Missing oletx info.txt# +z:/src/nt/com/complus/dtc/dtc/Inc/TMMSG.H +z:\src\nt\com\complus\dtc\dtc\Inc\#TMMSG.H# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/CONNTYPE_TXUSER_DTCLURECOVERYINITIATEDBYLU.txt +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\#CONNTYPE_TXUSER_DTCLURECOVERYINITIATEDBYLU.txt# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/CONNTYPE_TXUSER_DTCLURMENLISTMENT.txt +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\#CONNTYPE_TXUSER_DTCLURMENLISTMENT.txt# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/conntype_txuser_phase0/txuser_phase0_mtag_create.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\conntype_txuser_phase0\#txuser_phase0_mtag_create.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/CONNTYPE_TXUSER_DTCLUCONFIGURE.txt +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\#CONNTYPE_TXUSER_DTCLUCONFIGURE.txt# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/CONNTYPE_TXUSER_DTCLURECOVERYINITIATEDBYDTC.txt +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\#CONNTYPE_TXUSER_DTCLURECOVERYINITIATEDBYDTC.txt# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/CONNTYPE_TXUSER_DTCLURECOVERY.txt +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\#CONNTYPE_TXUSER_DTCLURECOVERY.txt# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/CONNTYPE_TXUSER_DTCLUINFO.txt +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\#CONNTYPE_TXUSER_DTCLUINFO.txt# +z:/src/nt/com/complus/dtc/dtc/TM/src/tmsuper.cpp +z:\src\nt\com\complus\dtc\dtc\TM\src\#tmsuper.cpp# +c:/Users/JohnDoty/Desktop/smb_smb_com_read_andx.xml +c:\Users\JohnDoty\Desktop\#smb_smb_com_read_andx.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/Schema/packet_v2.dtd +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\Schema\#packet_v2.dtd# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/partnertm_checkabort_mtag_check.xml +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\#partnertm_checkabort_mtag_check.xml# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/XML/CONNTYPE_TXUSER_DTCLURMENLISTMENT.txt +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\XML\#CONNTYPE_TXUSER_DTCLURMENLISTMENT.txt# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/CONNTYPE_TXUSER_PHASE0.txt +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\#CONNTYPE_TXUSER_PHASE0.txt# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/CONNTYPE_TXUSER_EXPORT.txt +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\#CONNTYPE_TXUSER_EXPORT.txt# +//Tkzaw-pro-18/Mydocs3/JohnDoty/My Documents/My Documents/Protocol Documentation/states.txt +\\Tkzaw-pro-18\Mydocs3\JohnDoty\My Documents\My Documents\Protocol Documentation\#states.txt# +z:/src/nt/com/complus/dtc/dtc/Inc/XAMSG.H +z:\src\nt\com\complus\dtc\dtc\Inc\#XAMSG.H# +z:/src/nt/com/complus/dtc/dtc/Inc/XATMMSG.H +z:\src\nt\com\complus\dtc\dtc\Inc\#XATMMSG.H# +z:/src/xws/team/docs/transactions/longhorn/Basics/Compliance/CONNTYPE_PARTNERTM_BRANCH.txt +z:\src\xws\team\docs\transactions\longhorn\Basics\Compliance\#CONNTYPE_PARTNERTM_BRANCH.txt# +z:/src/nt/com/complus/dtc/dtc/TM/src/tmsubord.cpp +z:\src\nt\com\complus\dtc\dtc\TM\src\#tmsubord.cpp# +z:/src/nt/com/complus/dtc/dtc/TM/src/TMINIT.CPP +z:\src\nt\com\complus\dtc\dtc\TM\src\#TMINIT.CPP# +z:/src/dd/indigo_wap/ndp/indigo/src/Log/System/IO/Log/LogLogRecord.cs +z:\src\dd\indigo_wap\ndp\indigo\src\Log\System\IO\Log\#LogLogRecord.cs# +z:/src/nt/com/complus/dtc/dtc/TM/src/TMBROD.CPP +z:\src\nt\com\complus\dtc\dtc\TM\src\#TMBROD.CPP# +z:/src/nt/com/complus/dtc/dtc/TM/src/TMEXPORT.CPP +z:\src\nt\com\complus\dtc\dtc\TM\src\#TMEXPORT.CPP# +z:/src/dd/indigo_wap/ndp/indigo/src/Log/System/IO/Log/LogLogRecordEnumerator.cs +z:\src\dd\indigo_wap\ndp\indigo\src\Log\System\IO\Log\#LogLogRecordEnumerator.cs# diff --git a/.emacs.d/auto-save-list/.saves-5060-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-5060-JOHNDOTY-1~ new file mode 100644 index 0000000..2f9482f --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-5060-JOHNDOTY-1~ @@ -0,0 +1,6 @@ +c:/src/AutopilotService/autopilotService/Co1PPE/xbox-Test-co1ppe/deployment.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xbox-Test-co1ppe\#deployment.ini# +c:/src/AutopilotService/autopilotService/Co1PPE/xbox-Test-co1ppe/machines.csv +c:\src\AutopilotService\autopilotService\Co1PPE\xbox-Test-co1ppe\#machines.csv# +//transfer/transfer/johndoty/PurchaseService.20/servicemap.ini +\\transfer\transfer\johndoty\PurchaseService.20\#servicemap.ini# diff --git a/.emacs.d/auto-save-list/.saves-5112-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-5112-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..8870083 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-5112-JOHNDOTY-USBOX~ @@ -0,0 +1,30 @@ +z:/src/nt/com/complus/dtc/dtc/Inc/UTLIST2.H +z:\src\nt\com\complus\dtc\dtc\Inc\#UTLIST2.H# +z:/src/nt/com/complus/dtc/inc/UTLIST.H +z:\src\nt\com\complus\dtc\inc\#UTLIST.H# +z:/src/nt/com/complus/dtc/dtc/TM/inc/TMFIND.H +z:\src\nt\com\complus\dtc\dtc\TM\inc\#TMFIND.H# +//witfs/Public/Scratch/JohnDoty/scripts/Dtc/tm_txlist.js +\\witfs\Public\Scratch\JohnDoty\scripts\Dtc\#tm_txlist.js# +z:/src/nt/com/complus/dtc/dtc/TM/inc/TMTX.H +z:\src\nt\com\complus\dtc\dtc\TM\inc\#TMTX.H# +//witfs/Public/Scratch/JohnDoty/scripts/Dtc/cm_common.js +\\witfs\Public\Scratch\JohnDoty\scripts\Dtc\#cm_common.js# +z:/src/nt/com/complus/dtc/dtc/TM/src/TMFIND.CPP +z:\src\nt\com\complus\dtc\dtc\TM\src\#TMFIND.CPP# +//witfs/Public/Scratch/JohnDoty/scripts/Dtc/prx_txlist.js +\\witfs\Public\Scratch\JohnDoty\scripts\Dtc\#prx_txlist.js# +z:/src/nt/com/complus/dtc/inc/DTCCM.H +z:\src\nt\com\complus\dtc\inc\#DTCCM.H# +z:/src/nt/com/complus/dtc/dtc/Inc/TMMSG.H +z:\src\nt\com\complus\dtc\dtc\Inc\#TMMSG.H# +z:/src/nt/com/complus/dtc/dtc/Inc/KtmRmMsg.h +z:\src\nt\com\complus\dtc\dtc\Inc\#KtmRmMsg.h# +z:/src/nt/com/complus/dtc/dtc/Inc/XATMMSG.H +z:\src\nt\com\complus\dtc\dtc\Inc\#XATMMSG.H# +//witfs/Public/Scratch/JohnDoty/scripts/Dtc/cm_listconnections.js +\\witfs\Public\Scratch\JohnDoty\scripts\Dtc\#cm_listconnections.js# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/inc/dtcprxtx.h +z:\src\nt\com\complus\dtc\dtc\msdtcprx\inc\#dtcprxtx.h# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/dtcprxtx.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#dtcprxtx.cpp# diff --git a/.emacs.d/auto-save-list/.saves-5120-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-5120-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..88e5167 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-5120-JOHNDOTY-USBOX~ @@ -0,0 +1,24 @@ +z:/src/misc/rssfu/Engine/Engine.csproj +z:\src\misc\rssfu\Engine\#Engine.csproj# +z:/src/misc/rssfu/RssFu.Common.Targets +z:\src\misc\rssfu\#RssFu.Common.Targets# +z:/src/misc/rssfu/Engine/Python/jsonconverter.py +z:\src\misc\rssfu\Engine\Python\#jsonconverter.py# +z:/src/misc/rssfu/Engine/Python/feedconverter.py +z:\src\misc\rssfu\Engine\Python\#feedconverter.py# +z:/src/misc/rssfu/Engine/Python/feedparser.py +z:\src\misc\rssfu\Engine\Python\#feedparser.py# +z:/src/misc/rssfu/Engine/Python/json.py +z:\src\misc\rssfu\Engine\Python\#json.py# +z:/src/nt/com/complus/dtc/shared/Trace/src/TraceOutputSettings.cpp +z:\src\nt\com\complus\dtc\shared\Trace\src\#TraceOutputSettings.cpp# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/ClusterUtil.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#ClusterUtil.cpp# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/ClusterTmInstance.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#ClusterTmInstance.cpp# +z:/src/nt/com/complus/dtc/dtc/DTCUic/src/tminstancenode.cpp +z:\src\nt\com\complus\dtc\dtc\DTCUic\src\#tminstancenode.cpp# +z:/src/nt/com/complus/dtc/dtc/DTCUic/src/clusteredinstancesnode.cpp +z:\src\nt\com\complus\dtc\dtc\DTCUic\src\#clusteredinstancesnode.cpp# +//cpzaw-pro-05/mydocs1/JohnDoty/.emacs +\\cpzaw-pro-05\mydocs1\JohnDoty\#.emacs# diff --git a/.emacs.d/auto-save-list/.saves-5148-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-5148-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..88eda1e --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-5148-JOHNDOTY-USBOX~ @@ -0,0 +1,52 @@ +z:/src/nt/com/complus/dtc/dtc/DTCUic/src/tminstancenode.cpp +z:\src\nt\com\complus\dtc\dtc\DTCUic\src\#tminstancenode.cpp# +z:/src/nt/com/complus/dtc/dtc/MsDtc/Src/MSDTC.CPP +z:\src\nt\com\complus\dtc\dtc\MsDtc\Src\#MSDTC.CPP# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/DllGetTmCore.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#DllGetTmCore.cpp# +z:/src/nt/com/complus/dtc/dtc/Adme/namesvc.cpp +z:\src\nt\com\complus\dtc\dtc\Adme\#namesvc.cpp# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/LegacyClusterUtil.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#LegacyClusterUtil.cpp# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/DtcResource.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#DtcResource.cpp# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/DefaultResourceNotify.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#DefaultResourceNotify.cpp# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/ClusterServiceAccount.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#ClusterServiceAccount.cpp# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/ClusterTmInstance.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#ClusterTmInstance.cpp# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/ClusterHelper.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#ClusterHelper.cpp# +z:/src/nt/com/complus/dtc/dtc/Adme/NonClusterTmInstance.cpp +z:\src\nt\com\complus\dtc\dtc\Adme\#NonClusterTmInstance.cpp# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/mtxclu.def +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#mtxclu.def# +z:/src/nt/com/complus/dtc/inc/TMINSTANCE.H +z:\src\nt\com\complus\dtc\inc\#TMINSTANCE.H# +z:/src/nt/com/complus/dtc/shared/MtxClu/inc/ClusterHelper.h +z:\src\nt\com\complus\dtc\shared\MtxClu\inc\#ClusterHelper.h# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/ClusterUtil.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#ClusterUtil.cpp# +z:/src/nt/com/complus/dtc/shared/MtxClu/inc/ClusterTmInstance.h +z:\src\nt\com\complus\dtc\shared\MtxClu\inc\#ClusterTmInstance.h# +z:/src/nt/com/complus/dtc/shared/Util/stringutil.cpp +z:\src\nt\com\complus\dtc\shared\Util\#stringutil.cpp# +z:/src/nt/com/complus/dtc/inc/vcodes.h +z:\src\nt\com\complus\dtc\inc\#vcodes.h# +z:/src/nt/com/complus/dtc/dtc/DTCUic/src/uiclient.cpp +z:\src\nt\com\complus\dtc\dtc\DTCUic\src\#uiclient.cpp# +z:/src/nt/com/complus/dtc/dtc/DTCUic/src/uimisc.cpp +z:\src\nt\com\complus\dtc\dtc\DTCUic\src\#uimisc.cpp# +z:/src/nt/com/complus/dtc/dtc/DTCUic/src/componentdata.cpp +z:\src\nt\com\complus\dtc\dtc\DTCUic\src\#componentdata.cpp# +z:/src/nt/com/complus/Src/COMUI/comsnap/Node.cpp +z:\src\nt\com\complus\Src\COMUI\comsnap\#Node.cpp# +z:/src/nt/com/complus/Src/COMUI/ComUID/ScopImpl.cpp +z:\src\nt\com\complus\Src\COMUI\ComUID\#ScopImpl.cpp# +z:/src/nt/com/complus/Src/COMUI/ComUID/VacTCtl.CPP +z:\src\nt\com\complus\Src\COMUI\ComUID\#VacTCtl.CPP# +z:/src/nt/com/complus/Src/COMUI/ComUID/VacBrows.cpp +z:\src\nt\com\complus\Src\COMUI\ComUID\#VacBrows.cpp# +z:/src/nt/com/complus/Src/COMUI/ComUID/VacThrd.cpp +z:\src\nt\com\complus\Src\COMUI\ComUID\#VacThrd.cpp# diff --git a/.emacs.d/auto-save-list/.saves-5196-JOHNDOTY-IDES~ b/.emacs.d/auto-save-list/.saves-5196-JOHNDOTY-IDES~ new file mode 100644 index 0000000..dae2733 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-5196-JOHNDOTY-IDES~ @@ -0,0 +1,46 @@ +c:/src/csa/private/developer/johndoty/play/dtoy/App.xaml +c:\src\csa\private\developer\johndoty\play\dtoy\#App.xaml# +c:/src/csa/private/developer/johndoty/play/dtoy/UnscaleDoubleConverter.cs +c:\src\csa\private\developer\johndoty\play\dtoy\#UnscaleDoubleConverter.cs# +c:/src/csa/private/developer/johndoty/play/dtoy/Properties/Settings.Designer.cs +c:\src\csa\private\developer\johndoty\play\dtoy\Properties\#Settings.Designer.cs# +c:/src/csa/private/developer/johndoty/play/dtoy/Properties/Resources.resx +c:\src\csa\private\developer\johndoty\play\dtoy\Properties\#Resources.resx# +c:/src/csa/private/developer/johndoty/play/dtoy/Properties/Resources.Designer.cs +c:\src\csa\private\developer\johndoty\play\dtoy\Properties\#Resources.Designer.cs# +c:/src/csa/private/developer/johndoty/play/dtoy/Properties/AssemblyInfo.cs +c:\src\csa\private\developer\johndoty\play\dtoy\Properties\#AssemblyInfo.cs# +c:/src/csa/private/developer/johndoty/play/dtoy/MainWindow.xaml.cs +c:\src\csa\private\developer\johndoty\play\dtoy\#MainWindow.xaml.cs# +c:/src/csa/private/developer/johndoty/play/dtoy/MainWindow.xaml +c:\src\csa\private\developer\johndoty\play\dtoy\#MainWindow.xaml# +c:/src/csa/private/developer/johndoty/play/dtoy/DocViewer.cs +c:\src\csa\private\developer\johndoty\play\dtoy\#DocViewer.cs# +c:/src/csa/private/developer/johndoty/play/dtoy/DocFactory.cs +c:\src\csa\private\developer\johndoty\play\dtoy\#DocFactory.cs# +c:/src/csa/private/developer/johndoty/play/dtoy/Doc.cs +c:\src\csa\private\developer\johndoty\play\dtoy\#Doc.cs# +c:/src/csa/private/developer/johndoty/play/dtoy/Config.cs +c:\src\csa\private\developer\johndoty\play\dtoy\#Config.cs# +c:/src/csa/private/developer/johndoty/play/dtoy/AssemblyCatalogSource.cs +c:\src\csa\private\developer\johndoty\play\dtoy\#AssemblyCatalogSource.cs# +c:/src/csa/private/developer/johndoty/play/dtoy/App.xaml.cs +c:\src\csa\private\developer\johndoty\play\dtoy\#App.xaml.cs# +c:/src/csa/private/developer/johndoty/play/dtoy/dtoy.csproj +c:\src\csa\private\developer\johndoty\play\dtoy\#dtoy.csproj# +c:/src/csa/private/Concept/Tools/VSCoreEditor2/Text/Impl/TextMarkerAdornment/TextMarkerVisualManager.cs +c:\src\csa\private\Concept\Tools\VSCoreEditor2\Text\Impl\TextMarkerAdornment\#TextMarkerVisualManager.cs# +c:/src/csa/private/Concept/Tools/VSCoreEditor2/Text/Def/TextUI/Adornments/StandardErrorTypeService.cs +c:\src\csa\private\Concept\Tools\VSCoreEditor2\Text\Def\TextUI\Adornments\#StandardErrorTypeService.cs# +c:/src/csa/private/Concept/Tools/VSCoreEditor2/Text/Def/TextUI/Adornments/ErrorTypeDefinition.cs +c:\src\csa\private\Concept\Tools\VSCoreEditor2\Text\Def\TextUI\Adornments\#ErrorTypeDefinition.cs# +c:/src/csa/private/Concept/Tools/VSCoreEditor2/Text/Def/TextUI/Adornments/ITextMarkerProvider.cs +c:\src\csa\private\Concept\Tools\VSCoreEditor2\Text\Def\TextUI\Adornments\#ITextMarkerProvider.cs# +c:/src/csa/private/Concept/Tools/VSCoreEditor2/Text/Impl/TextMarkerAdornment/TextMarkerProvider.cs +c:\src\csa\private\Concept\Tools\VSCoreEditor2\Text\Impl\TextMarkerAdornment\#TextMarkerProvider.cs# +c:/src/csa/private/Concept/Tools/VSCoreEditor2/Text/Impl/TextMarkerAdornment/TextMarkerAdornment.cs +c:\src\csa\private\Concept\Tools\VSCoreEditor2\Text\Impl\TextMarkerAdornment\#TextMarkerAdornment.cs# +c:/src/csa/private/Concept/Tools/VSCoreEditor2/Text/Def/TextUI/Adornments/ITextMarkerProviderFactory.cs +c:\src\csa\private\Concept\Tools\VSCoreEditor2\Text\Def\TextUI\Adornments\#ITextMarkerProviderFactory.cs# +c:/Users/JohnDoty/Documents/.emacs +c:\Users\JohnDoty\Documents\#.emacs# diff --git a/.emacs.d/auto-save-list/.saves-5204-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-5204-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..e8af3ea --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-5204-JOHNDOTY-USBOX~ @@ -0,0 +1,58 @@ +z:/src/nt/com/complus/dtc/dtc/CM/Src/CRM.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#CRM.CPP# +z:/src/nt/com/complus/dtc/dtc/CM/Src/CCM.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#CCM.CPP# +z:/src/nt/com/complus/dtc/dtc/CM/Inc/CCM.H +z:\src\nt\com\complus\dtc\dtc\CM\Inc\#CCM.H# +z:/temp/report.txt +z:\temp\#report.txt# +z:/src/nt/com/complus/dtc/shared/Util/memmgr.cpp +z:\src\nt\com\complus\dtc\shared\Util\#memmgr.cpp# +z:/src/nt/com/complus/dtc/dtc/CMHelper/cmhelper.cpp +z:\src\nt\com\complus\dtc\dtc\CMHelper\#cmhelper.cpp# +z:/src/nt/com/complus/Src/Shared/Util/UTSEM.cpp +z:\src\nt\com\complus\Src\Shared\Util\#UTSEM.cpp# +z:/src/nt/com/complus/Src/Inc/UTSEM.H +z:\src\nt\com\complus\Src\Inc\#UTSEM.H# +z:/src/nt/com/complus/dtc/dtc/Inc/CMHELPER.H +z:\src\nt\com\complus\dtc\dtc\Inc\#CMHELPER.H# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/comdll.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#comdll.cpp# +z:/src/nt/com/complus/dtc/dtc/TM/src/sources +z:\src\nt\com\complus\dtc\dtc\TM\src\#sources# +z:/src/nt/com/complus/dtc/dtc/TM/src/TMCOMDLL.CPP +z:\src\nt\com\complus\dtc\dtc\TM\src\#TMCOMDLL.CPP# +z:/src/nt/com/complus/dtc/ociresdisp/OCIWrapperDll.CPP +z:\src\nt\com\complus\dtc\ociresdisp\#OCIWrapperDll.CPP# +z:/src/nt/com/complus/dtc/inc/mmgr.h +z:\src\nt\com\complus\dtc\inc\#mmgr.h# +z:/src/nt/com/complus/dtc/dtc/KtmRm/src/dtckrm.cpp +z:\src\nt\com\complus\dtc\dtc\KtmRm\src\#dtckrm.cpp# +z:/src/nt/testsrc/comtest/lh/dtc/DevSuites/ProxyUnload/proxyunload.cpp +z:\src\nt\testsrc\comtest\lh\dtc\DevSuites\ProxyUnload\#proxyunload.cpp# +z:/src/nt/com/complus/dtc/dtc/CM/Src/IOMGRRPC.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#IOMGRRPC.CPP# +z:/src/nt/com/complus/dtc/dtc/CM/Inc/IPIOMGR.ACF +z:\src\nt\com\complus\dtc\dtc\CM\Inc\#IPIOMGR.ACF# +z:/src/nt/com/complus/dtc/dtc/CM/Src/IOMGRSRV.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#IOMGRSRV.CPP# +z:/src/nt/com/complus/dtc/dtc/Inc/TMMSG.H +z:\src\nt\com\complus\dtc\dtc\Inc\#TMMSG.H# +z:/src/nt/com/complus/dtc/dtc/CM/Inc/IOMGR.H +z:\src\nt\com\complus\dtc\dtc\CM\Inc\#IOMGR.H# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/DllGetTmCore.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#DllGetTmCore.cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/dtcprxcf.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#dtcprxcf.cpp# +//Tkzaw-pro-18/Mydocs3/JohnDoty/My Documents/notes.txt +\\Tkzaw-pro-18\Mydocs3\JohnDoty\My Documents\#notes.txt# +z:/temp/foo.txt +z:\temp\#foo.txt# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/dtcprx.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#dtcprx.cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/dtcprxtx.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#dtcprxtx.cpp# +z:/src/nt/testsrc/comtest/lh/dtc/DevSuites/ProxyUnload/sources +z:\src\nt\testsrc\comtest\lh\dtc\DevSuites\ProxyUnload\#sources# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/msdtcprx.def +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#msdtcprx.def# diff --git a/.emacs.d/auto-save-list/.saves-5264-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-5264-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..5115e21 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-5264-JOHNDOTY-USBOX~ @@ -0,0 +1,4 @@ +z:/src/nt/public/sdk/inc/winerror.h +z:\src\nt\public\sdk\inc\#winerror.h# +z:/temp/assign.txt +z:\temp\#assign.txt# diff --git a/.emacs.d/auto-save-list/.saves-5276-BIFROST~ b/.emacs.d/auto-save-list/.saves-5276-BIFROST~ new file mode 100644 index 0000000..991d468 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-5276-BIFROST~ @@ -0,0 +1,2 @@ +f:/src/DCFilters/MatroskaU/MatroskaU.vcxproj +f:\src\DCFilters\MatroskaU\#MatroskaU.vcxproj# diff --git a/.emacs.d/auto-save-list/.saves-5276-GABRIEL-JD~ b/.emacs.d/auto-save-list/.saves-5276-GABRIEL-JD~ new file mode 100644 index 0000000..876e5da --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-5276-GABRIEL-JD~ @@ -0,0 +1,2 @@ +c:/temp/m.m +c:\temp\#m.m# diff --git a/.emacs.d/auto-save-list/.saves-5288-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-5288-JOHNDOTY-1~ new file mode 100644 index 0000000..dc0c922 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-5288-JOHNDOTY-1~ @@ -0,0 +1,10 @@ +c:/src/xonline/private/setup/octopus/xdl/definition/topologies/expanded.xml +c:\src\xonline\private\setup\octopus\xdl\definition\topologies\#expanded.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/frontdoors/ProfileShim.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\frontdoors\#ProfileShim.xml# +c:/src/newcommerce/Tools/Packages/Main/apsdk/10.8.13.52429/Package.nuspec +c:\src\newcommerce\Tools\Packages\Main\apsdk\10.8.13.52429\#Package.nuspec# +c:/src/newcommerce/Tools/xdlc/Main/private/src/xdlc/Definition.cs +c:\src\newcommerce\Tools\xdlc\Main\private\src\xdlc\#Definition.cs# +c:/src/newcommerce/Tools/xdlc/Main/private/src/xdlc/AssemblyInfo.cs +c:\src\newcommerce\Tools\xdlc\Main\private\src\xdlc\#AssemblyInfo.cs# diff --git a/.emacs.d/auto-save-list/.saves-5356-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-5356-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..1157fe6 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-5356-JOHNDOTY-USBOX~ @@ -0,0 +1,18 @@ +z:/src/xpsp2/com/com1x/DTC/inc/txdtc.idl +z:\src\xpsp2\com\com1x\DTC\inc\#txdtc.idl# +z:/src/xpsp2/com/com1x/DTC/dtc/MsDtcPrx/src/dtcprx.cpp +z:\src\xpsp2\com\com1x\DTC\dtc\MsDtcPrx\src\#dtcprx.cpp# +z:/src/xpsp2/com/com1x/DTC/dtc/MsDtcPrx/src/dtcprxxa.cpp +z:\src\xpsp2\com\com1x\DTC\dtc\MsDtcPrx\src\#dtcprxxa.cpp# +z:/src/xpsp2/com/com1x/DTC/dtc/MsDtcPrx/inc/dtcprxxa.h +z:\src\xpsp2\com\com1x\DTC\dtc\MsDtcPrx\inc\#dtcprxxa.h# +z:/src/xpsp2/com/com1x/DTC/dtc/MsDtcPrx/inc/xamapper.h +z:\src\xpsp2\com\com1x\DTC\dtc\MsDtcPrx\inc\#xamapper.h# +z:/src/xpsp2/com/com1x/DTC/dtc/MsDtcPrx/src/xamapper.cpp +z:\src\xpsp2\com\com1x\DTC\dtc\MsDtcPrx\src\#xamapper.cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/xamapper.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#xamapper.cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/dtcprxxa.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#dtcprxxa.cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/inc/dtcprxxa.h +z:\src\nt\com\complus\dtc\dtc\msdtcprx\inc\#dtcprxxa.h# diff --git a/.emacs.d/auto-save-list/.saves-5444-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-5444-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..e69de29 diff --git a/.emacs.d/auto-save-list/.saves-5464-BIFROST~ b/.emacs.d/auto-save-list/.saves-5464-BIFROST~ new file mode 100644 index 0000000..e0e16f2 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-5464-BIFROST~ @@ -0,0 +1,6 @@ +f:/src/EncoderUI/readme.txt +f:\src\EncoderUI\#readme.txt# +c:/Program Files/Bonjour SDK/Samples/CS/SimpleChat/SimpleChat.cs +c:\Program Files\Bonjour SDK\Samples\CS\SimpleChat\#SimpleChat.cs# +c:/Program Files/Bonjour SDK/Samples/CS/SimpleChat/SimpleChat.NET.csproj +c:\Program Files\Bonjour SDK\Samples\CS\SimpleChat\#SimpleChat.NET.csproj# diff --git a/.emacs.d/auto-save-list/.saves-5480-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-5480-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..955244d --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-5480-JOHNDOTY-USBOX~ @@ -0,0 +1,12 @@ +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/ProxyPlugin.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#ProxyPlugin.cpp# +z:/src/misc/rssfu/Tests/TestServer.cs +z:\src\misc\rssfu\Tests\#TestServer.cs# +z:/src/misc/rssfu/Tests/StringServer.cs +z:\src\misc\rssfu\Tests\#StringServer.cs# +z:/src/nt/com/complus/dtc/dtc/DTCUic/src/componentdata.cpp +z:\src\nt\com\complus\dtc\dtc\DTCUic\src\#componentdata.cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/dtcinit.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#dtcinit.cpp# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/ClusterTmInstance.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#ClusterTmInstance.cpp# diff --git a/.emacs.d/auto-save-list/.saves-5648-GABRIEL-JD~ b/.emacs.d/auto-save-list/.saves-5648-GABRIEL-JD~ new file mode 100644 index 0000000..f517eb5 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-5648-GABRIEL-JD~ @@ -0,0 +1,2 @@ +c:/src/misc/foo.igor +c:\src\misc\#foo.igor# diff --git a/.emacs.d/auto-save-list/.saves-5672-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-5672-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..fa53073 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-5672-JOHNDOTY-USBOX~ @@ -0,0 +1,24 @@ +z:/src/nt/com/complus/dtc/dtc/CM/Src/CCM.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#CCM.CPP# +z:/src/nt/com/complus/dtc/dtc/CM/Src/CSO.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#CSO.CPP# +z:/src/nt/com/complus/dtc/dtc/CM/Src/DTCCM.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#DTCCM.CPP# +z:/src/nt/com/complus/dtc/dtc/CM/Src/IOMGRRPC.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#IOMGRRPC.CPP# +z:/src/nt/com/complus/dtc/dtc/CM/Src/CMUISCON.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#CMUISCON.CPP# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/dtcprx.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#dtcprx.cpp# +z:/src/nt/com/complus/dtc/dtc/CM/Src/IOMGRSRV.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#IOMGRSRV.CPP# +z:/src/nt/com/complus/dtc/dtc/MsDtc/Src/MSDTC.CPP +z:\src\nt\com\complus\dtc\dtc\MsDtc\Src\#MSDTC.CPP# +z:/src/nt/com/complus/dtc/dtc/CM/Src/sources +z:\src\nt\com\complus\dtc\dtc\CM\Src\#sources# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/dtcinit.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#dtcinit.cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/DllGetTmCore.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#DllGetTmCore.cpp# +z:/src/nt/com/complus/dtc/inc/XOLEHLP.H +z:\src\nt\com\complus\dtc\inc\#XOLEHLP.H# diff --git a/.emacs.d/auto-save-list/.saves-5880-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-5880-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..d4b3d83 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-5880-JOHNDOTY-USBOX~ @@ -0,0 +1,18 @@ +z:/src/xpsp2/com/com1x/DTC/dtc/MsDtcPrx/src/dtcxamap.cpp +z:\src\xpsp2\com\com1x\DTC\dtc\MsDtcPrx\src\#dtcxamap.cpp# +z:/src/xpsp2/com/com1x/DTC/dtc/MsDtcPrx/src/xaxact.cpp +z:\src\xpsp2\com\com1x\DTC\dtc\MsDtcPrx\src\#xaxact.cpp# +z:/src/xpsp2/com/com1x/DTC/dtc/MsDtcPrx/src/xamapper.cpp +z:\src\xpsp2\com\com1x\DTC\dtc\MsDtcPrx\src\#xamapper.cpp# +z:/src/xpsp2/com/com1x/DTC/dtc/MsDtcPrx/inc/xaxact.h +z:\src\xpsp2\com\com1x\DTC\dtc\MsDtcPrx\inc\#xaxact.h# +z:/src/xpsp2/com/com1x/DTC/dtc/MsDtcPrx/src/comdll.cpp +z:\src\xpsp2\com\com1x\DTC\dtc\MsDtcPrx\src\#comdll.cpp# +z:/src/w2k3sp1/com/complus/DTC/inc/xa.h +z:\src\w2k3sp1\com\complus\DTC\inc\#xa.h# +z:/src/w2k3sp1/com/complus/DTC/dtc/MsDtcPrx/src/dtcxamap.cpp +z:\src\w2k3sp1\com\complus\DTC\dtc\MsDtcPrx\src\#dtcxamap.cpp# +z:/src/xpsp2/com/com1x/DTC/inc/xa.h +z:\src\xpsp2\com\com1x\DTC\inc\#xa.h# +z:/src/xpsp2/com/com1x/DTC/dtc/MsDtcPrx/src/dtcprxxa.cpp +z:\src\xpsp2\com\com1x\DTC\dtc\MsDtcPrx\src\#dtcprxxa.cpp# diff --git a/.emacs.d/auto-save-list/.saves-5908-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-5908-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..557d8a9 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-5908-JOHNDOTY-USBOX~ @@ -0,0 +1,20 @@ +z:/src/dd/Lab21S/ndp/fx/src/WinForms/Managed/System/WinForms/NativeWindow.cs +z:\src\dd\Lab21S\ndp\fx\src\WinForms\Managed\System\WinForms\#NativeWindow.cs# +z:/src/dd/Lab21S/ndp/fx/src/WinForms/Managed/System/WinForms/NotifyIcon.cs +z:\src\dd\Lab21S\ndp\fx\src\WinForms\Managed\System\WinForms\#NotifyIcon.cs# +z:/src/misc/pwlet/PasswordForm.cs +z:\src\misc\pwlet\#PasswordForm.cs# +z:/src/misc/pwlet/pwlet.csproj +z:\src\misc\pwlet\#pwlet.csproj# +z:/src/misc/pwlet/OptionsForm.cs +z:\src\misc\pwlet\#OptionsForm.cs# +z:/src/misc/pwlet/PasswordApplication.cs +z:\src\misc\pwlet\#PasswordApplication.cs# +z:/src/misc/pwlet/Options.cs +z:\src\misc\pwlet\#Options.cs# +z:/src/misc/pwlet/Fonts.cs +z:\src\misc\pwlet\#Fonts.cs# +c:/Windows/Microsoft.NET/Framework/v2.0.50727/Microsoft.CSharp.targets +c:\Windows\Microsoft.NET\Framework\v2.0.50727\#Microsoft.CSharp.targets# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/dtcprxtx.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#dtcprxtx.cpp# diff --git a/.emacs.d/auto-save-list/.saves-5984-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-5984-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..29e8321 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-5984-JOHNDOTY-USBOX~ @@ -0,0 +1,56 @@ +z:/src/nt/com/complus/dtc/dtc/Adme/NonClusterTmInstance.cpp +z:\src\nt\com\complus\dtc\dtc\Adme\#NonClusterTmInstance.cpp# +z:/src/nt/com/complus/dtc/dtc/CM/Src/IOMGRRPC.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#IOMGRRPC.CPP# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/dtcprxrm.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#dtcprxrm.cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/dtcinit.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#dtcinit.cpp# +z:/src/nt/com/complus/dtc/inc/vcodes.h +z:\src\nt\com\complus\dtc\inc\#vcodes.h# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/DllGetTmCore.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#DllGetTmCore.cpp# +z:/src/nt/com/complus/dtc/dtc/DTCUic/src/nonclusterglobalpage.cpp +z:\src\nt\com\complus\dtc\dtc\DTCUic\src\#nonclusterglobalpage.cpp# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/ClusterServiceAccount.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#ClusterServiceAccount.cpp# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/ClusterUtil.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#ClusterUtil.cpp# +z:/src/nt/com/complus/dtc/dtc/DTCUic/src/uiclient.cpp +z:\src\nt\com\complus\dtc\dtc\DTCUic\src\#uiclient.cpp# +z:/src/nt/com/complus/dtc/inc/DTC.H +z:\src\nt\com\complus\dtc\inc\#DTC.H# +z:/src/nt/com/complus/dtc/dtc/DTCUic/inc/uiclient.h +z:\src\nt\com\complus\dtc\dtc\DTCUic\inc\#uiclient.h# +z:/src/nt/com/complus/dtc/inc/TMINSTANCE.H +z:\src\nt\com\complus\dtc\inc\#TMINSTANCE.H# +z:/src/nt/com/complus/dtc/shared/Util/dispenserhelper.cpp +z:\src\nt\com\complus\dtc\shared\Util\#dispenserhelper.cpp# +z:/src/nt/com/complus/dtc/inc/dispenserhelper.h +z:\src\nt\com\complus\dtc\inc\#dispenserhelper.h# +z:/src/nt/com/complus/dtc/shared/Util/dtcini.cpp +z:\src\nt\com\complus\dtc\shared\Util\#dtcini.cpp# +z:/src/nt/com/complus/dtc/dtc/CM/Src/IOMGRCLT.CPP +z:\src\nt\com\complus\dtc\dtc\CM\Src\#IOMGRCLT.CPP# +z:/src/nt/com/complus/dtc/dtc/Adme/namesvc.cpp +z:\src\nt\com\complus\dtc\dtc\Adme\#namesvc.cpp# +z:/src/nt/com/complus/dtc/shared/MtxClu/src/ClusterTmInstance.cpp +z:\src\nt\com\complus\dtc\shared\MtxClu\src\#ClusterTmInstance.cpp# +z:/src/nt/base/cluster/clusapi/registry.c +z:\src\nt\base\cluster\clusapi\#registry.c# +z:/src/nt/base/cluster/clusapi/clusapip.h +z:\src\nt\base\cluster\clusapi\#clusapip.h# +z:/src/misc/machinesetup.cs +z:\src\misc\#machinesetup.cs# +z:/src/dd/indigo_wap/ndp/indigo/src/Log/System/IO/Log/SequenceNumber.cs +z:\src\dd\indigo_wap\ndp\indigo\src\Log\System\IO\Log\#SequenceNumber.cs# +z:/src/dd/indigo_wap/ndp/indigo/src/Log/System/IO/Log/IRecordSequence.cs +z:\src\dd\indigo_wap\ndp\indigo\src\Log\System\IO\Log\#IRecordSequence.cs# +z:/src/nt/base/cluster/clusapi/ClusNode.h +z:\src\nt\base\cluster\clusapi\#ClusNode.h# +z:/src/nt/base/cluster/clusapi/createclus.cpp +z:\src\nt\base\cluster\clusapi\#createclus.cpp# +z:/src/nt/base/cluster/clusrtl/compobj.cpp +z:\src\nt\base\cluster\clusrtl\#compobj.cpp# +z:/src/nt/base/cluster/clusapi/clusapi.c +z:\src\nt\base\cluster\clusapi\#clusapi.c# diff --git a/.emacs.d/auto-save-list/.saves-6004-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-6004-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..4dcbc74 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-6004-JOHNDOTY-USBOX~ @@ -0,0 +1,26 @@ +z:/src/nt/com/complus/Src/drt/FakeCM/ipiomgr.idl +z:\src\nt\com\complus\Src\drt\FakeCM\#ipiomgr.idl# +z:/src/nt/com/complus/DTC/inc/DTC.H +z:\src\nt\com\complus\DTC\inc\#DTC.H# +z:/src/nt/com/complus/DTC/dtc/CM/Src/IOMGRSRV.CPP +z:\src\nt\com\complus\DTC\dtc\CM\Src\#IOMGRSRV.CPP# +z:/src/nt/com/complus/DTC/dtc/CM/Src/IOMGRRPC.CPP +z:\src\nt\com\complus\DTC\dtc\CM\Src\#IOMGRRPC.CPP# +z:/src/nt/com/complus/Src/drt/FakeCM/FakeCM.cpp +z:\src\nt\com\complus\Src\drt\FakeCM\#FakeCM.cpp# +z:/src/nt/com/complus/DTC/dtc/MsDtcPrx/src/dtcinit.cpp +z:\src\nt\com\complus\DTC\dtc\MsDtcPrx\src\#dtcinit.cpp# +z:/src/nt/com/complus/DTC/shared/Util/basetminstance.cpp +z:\src\nt\com\complus\DTC\shared\Util\#basetminstance.cpp# +z:/src/nt/com/complus/DTC/dtc/Adme/namesvc.cpp +z:\src\nt\com\complus\DTC\dtc\Adme\#namesvc.cpp# +z:/src/nt/com/complus/DTC/dtc/CM/Src/cmsettings.cpp +z:\src\nt\com\complus\DTC\dtc\CM\Src\#cmsettings.cpp# +z:/src/nt/com/complus/Src/drt/FakeCM/sources +z:\src\nt\com\complus\Src\drt\FakeCM\#sources# +z:/src/nt/sdpublic/sdk/inc/strsafe.h +z:\src\nt\sdpublic\sdk\inc\#strsafe.h# +z:/src/nt/com/complus/DTC/dtc/CM/Src/sources +z:\src\nt\com\complus\DTC\dtc\CM\Src\#sources# +z:/src/nt/com/complus/DTC/dtc/CM/Inc/sources +z:\src\nt\com\complus\DTC\dtc\CM\Inc\#sources# diff --git a/.emacs.d/auto-save-list/.saves-6024-JOHNDOTY-IDES~ b/.emacs.d/auto-save-list/.saves-6024-JOHNDOTY-IDES~ new file mode 100644 index 0000000..f369bf3 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-6024-JOHNDOTY-IDES~ @@ -0,0 +1,4 @@ +c:/src/oslo/private/developer/JohnDoty/build/userenv.ps1 +c:\src\oslo\private\developer\JohnDoty\build\#userenv.ps1# +c:/users/johndoty/documents/site-lisp/powershell-mode.el +c:\users\johndoty\documents\site-lisp\#powershell-mode.el# diff --git a/.emacs.d/auto-save-list/.saves-6120-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-6120-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..3d0e0cd --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-6120-JOHNDOTY-USBOX~ @@ -0,0 +1,2 @@ +z:/src/nt/com/complus/comres/msdtcprx.rc2 +z:\src\nt\com\complus\comres\#msdtcprx.rc2# diff --git a/.emacs.d/auto-save-list/.saves-6196-BIFROST~ b/.emacs.d/auto-save-list/.saves-6196-BIFROST~ new file mode 100644 index 0000000..e017844 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-6196-BIFROST~ @@ -0,0 +1,4 @@ +f:/src/DCFilters/Debug/foo.txt +f:\src\DCFilters\Debug\#foo.txt# +f:/src/DCFilters/DCFilters.sln +f:\src\DCFilters\#DCFilters.sln# diff --git a/.emacs.d/auto-save-list/.saves-6272-BIFROST~ b/.emacs.d/auto-save-list/.saves-6272-BIFROST~ new file mode 100644 index 0000000..7b3ec07 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-6272-BIFROST~ @@ -0,0 +1,12 @@ +c:/src/iggy/src/igweb/js/dnd4data.js +c:\src\iggy\src\igweb\js\#dnd4data.js# +c:/src/iggy/src/igweb/index.html +c:\src\iggy\src\igweb\#index.html# +c:/src/iggy/src/igweb/js/model.js +c:\src\iggy\src\igweb\js\#model.js# +c:/src/iggy/README.markdown +c:\src\iggy\#README.markdown# +c:/src/iggy/src/igweb/js/dnd4model.js +c:\src\iggy\src\igweb\js\#dnd4model.js# +c:/src/iggy/src/igweb/js/binding.js +c:\src\iggy\src\igweb\js\#binding.js# diff --git a/.emacs.d/auto-save-list/.saves-6412-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-6412-JOHNDOTY-1~ new file mode 100644 index 0000000..b654571 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-6412-JOHNDOTY-1~ @@ -0,0 +1,2 @@ +c:/src/oslo/private/developer/johndoty/build/userenv.ps1 +c:\src\oslo\private\developer\johndoty\build\#userenv.ps1# diff --git a/.emacs.d/auto-save-list/.saves-6488-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-6488-JOHNDOTY-1~ new file mode 100644 index 0000000..59e723d --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-6488-JOHNDOTY-1~ @@ -0,0 +1,14 @@ +c:/temp/foo.xml +c:\temp\#foo.xml# +c:/temp/foo.deployment.xml +c:\temp\#foo.deployment.xml# +c:/src/commerce/PurchaseService/private/service/purchase/src/receiptstore/webstore/deployment_partnernet.xml +c:\src\commerce\PurchaseService\private\service\purchase\src\receiptstore\webstore\#deployment_partnernet.xml# +c:/src/commerce/PurchaseService/private/service/purchase/src/receiptstore/webstore/deployment_certnet.xml +c:\src\commerce\PurchaseService\private\service\purchase\src\receiptstore\webstore\#deployment_certnet.xml# +c:/src/commerce/PurchaseService/private/service/purchase/src/receiptstore/webstore/purchaseservicedb.manifest.xml +c:\src\commerce\PurchaseService\private\service\purchase\src\receiptstore\webstore\#purchaseservicedb.manifest.xml# +c:/src/commerce/PurchaseService/private/service/purchase/src/receiptstore/webstore/deployment_prodnet.xml +c:\src\commerce\PurchaseService\private\service\purchase\src\receiptstore\webstore\#deployment_prodnet.xml# +c:/src/commerce/PurchaseService/private/service/purchase/src/purchasefd/Microsoft/IEB/CommercialServices/Purchase/ErrorCodes.cs +c:\src\commerce\PurchaseService\private\service\purchase\src\purchasefd\Microsoft\IEB\CommercialServices\Purchase\#ErrorCodes.cs# diff --git a/.emacs.d/auto-save-list/.saves-6508-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-6508-JOHNDOTY-1~ new file mode 100644 index 0000000..c97c6b9 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-6508-JOHNDOTY-1~ @@ -0,0 +1,2 @@ +c:/src/msc/Main/Documents/Specification/Working/johndoty/modules.txt +c:\src\msc\Main\Documents\Specification\Working\johndoty\#modules.txt# diff --git a/.emacs.d/auto-save-list/.saves-6596-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-6596-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..3ae970f --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-6596-JOHNDOTY-USBOX~ @@ -0,0 +1,8 @@ +z:/src/misc/foo.idl +z:\src\misc\#foo.idl# +//Tkzaw-pro-18/Mydocs3/JohnDoty/My Documents/notes.txt +\\Tkzaw-pro-18\Mydocs3\JohnDoty\My Documents\#notes.txt# +z:/src/misc/foo.txt +z:\src\misc\#foo.txt# +z:/src/nt/com/complus/DTC/dtc/CM/Inc/IPIOMGR.IDL +z:\src\nt\com\complus\DTC\dtc\CM\Inc\#IPIOMGR.IDL# diff --git a/.emacs.d/auto-save-list/.saves-668-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-668-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..9773a96 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-668-JOHNDOTY-USBOX~ @@ -0,0 +1,18 @@ +//witfs/public/Scratch/JohnDoty/scripts/Dtc/cm_listconnections.js +\\witfs\public\Scratch\JohnDoty\scripts\Dtc\#cm_listconnections.js# +//witfs/public/Scratch/JohnDoty/scripts/Dtc/cm_stat_conn.js +\\witfs\public\Scratch\JohnDoty\scripts\Dtc\#cm_stat_conn.js# +z:/src/nt/com/complus/dtc/dtc/CM/Inc/CSO.H +z:\src\nt\com\complus\dtc\dtc\CM\Inc\#CSO.H# +z:/src/nt/com/complus/dtc/dtc/Inc/TMMSG.H +z:\src\nt\com\complus\dtc\dtc\Inc\#TMMSG.H# +//witfs/public/Scratch/JohnDoty/scripts/Dtc/cm_stat_conn_sent.js +\\witfs\public\Scratch\JohnDoty\scripts\Dtc\#cm_stat_conn_sent.js# +//witfs/public/Scratch/JohnDoty/scripts/Dtc/cm_common.js +\\witfs\public\Scratch\JohnDoty\scripts\Dtc\#cm_common.js# +z:/src/nt/com/complus/dtc/inc/DTCCM.H +z:\src\nt\com\complus\dtc\inc\#DTCCM.H# +//witfs/public/Scratch/JohnDoty/scripts/Dtc/cm_stat_cbt.js +\\witfs\public\Scratch\JohnDoty\scripts\Dtc\#cm_stat_cbt.js# +//witfs/public/Scratch/JohnDoty/scripts/Dtc/prx_txlist.js +\\witfs\public\Scratch\JohnDoty\scripts\Dtc\#prx_txlist.js# diff --git a/.emacs.d/auto-save-list/.saves-6768-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-6768-JOHNDOTY-1~ new file mode 100644 index 0000000..904a7bd --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-6768-JOHNDOTY-1~ @@ -0,0 +1,12 @@ +c:/src/commerce/PurchaseService/build/Microsoft.Build.targets +c:\src\commerce\PurchaseService\build\#Microsoft.Build.targets# +c:/src/commerce/PurchaseService/build/version/BuildNumber.targets +c:\src\commerce\PurchaseService\build\version\#BuildNumber.targets# +c:/src/commerce/PurchaseService/private/service/purchase/src/receiptstore/webstore/tables/receiptsByCreatedDate.table.sql +c:\src\commerce\PurchaseService\private\service\purchase\src\receiptstore\webstore\tables\#receiptsByCreatedDate.table.sql# +c:/src/commerce/PurchaseService/private/service/purchase/src/receiptstore/webstore/purchaseservicedb.manifest.xml +c:\src\commerce\PurchaseService\private\service\purchase\src\receiptstore\webstore\#purchaseservicedb.manifest.xml# +c:/src/commerce/PurchaseService/private/service/purchase/src/receiptstore/webstore/tables/receiptsByOrderId.table.sql +c:\src\commerce\PurchaseService\private\service\purchase\src\receiptstore\webstore\tables\#receiptsByOrderId.table.sql# +c:/src/commerce/PurchaseService/private/service/purchase/src/receiptstore/webstore/tables/receipts.table.sql +c:\src\commerce\PurchaseService\private\service\purchase\src\receiptstore\webstore\tables\#receipts.table.sql# diff --git a/.emacs.d/auto-save-list/.saves-6808-JOHNDOTY-IDES~ b/.emacs.d/auto-save-list/.saves-6808-JOHNDOTY-IDES~ new file mode 100644 index 0000000..3af62a6 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-6808-JOHNDOTY-IDES~ @@ -0,0 +1,2 @@ +c:/users/johndoty/documents/foo.lisp +c:\users\johndoty\documents\#foo.lisp# diff --git a/.emacs.d/auto-save-list/.saves-6972-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-6972-JOHNDOTY-1~ new file mode 100644 index 0000000..ceaff7b --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-6972-JOHNDOTY-1~ @@ -0,0 +1,22 @@ +c:/src/AutopilotService/autopilotService/Co1PPE/xbox-Test-co1ppe/deployment.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xbox-Test-co1ppe\#deployment.ini# +c:/src/xonline/private/setup/octopus/xdl/sources +c:\src\xonline\private\setup\octopus\xdl\#sources# +c:/src/xonline/public/ext/tools/makefile.def +c:\src\xonline\public\ext\tools\#makefile.def# +c:/src/xonline/private/setup/octopus/xdl/placefile +c:\src\xonline\private\setup\octopus\xdl\#placefile# +c:/src/xonline/tools/path1st/binplace.cmd +c:\src\xonline\tools\path1st\#binplace.cmd# +c:/src/xonline/private/setup/octopus/xdl/makefile.inc +c:\src\xonline\private\setup\octopus\xdl\#makefile.inc# +c:/src/xonline/private/setup/octopus/xdl/buildd.log +c:\src\xonline\private\setup\octopus\xdl\#buildd.log# +c:/temp/zomgout/AutoXOnline/sandbox/ActiveAuth/ConfigureVIPModule.psm1 +c:\temp\zomgout\AutoXOnline\sandbox\ActiveAuth\#ConfigureVIPModule.psm1# +//transfer/transfer/ajaykang/Test.1/ServiceMap.ini +\\transfer\transfer\ajaykang\Test.1\#ServiceMap.ini# +c:/temp/zomgout/AutoXOnline/sandbox/MixBetaManagement/ConfigureWcfBindingsModule.psm1 +c:\temp\zomgout\AutoXOnline\sandbox\MixBetaManagement\#ConfigureWcfBindingsModule.psm1# +c:/temp/zomgout/AutoXOnline/sandbox/MixBetaManagement/AutopilotSupport.psm1 +c:\temp\zomgout\AutoXOnline\sandbox\MixBetaManagement\#AutopilotSupport.psm1# diff --git a/.emacs.d/auto-save-list/.saves-7048-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-7048-JOHNDOTY-1~ new file mode 100644 index 0000000..855b0b8 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-7048-JOHNDOTY-1~ @@ -0,0 +1,54 @@ +c:/src/AutopilotService/autopilotService/Co1PPE/xbox-Test-co1ppe/deployment.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xbox-Test-co1ppe\#deployment.ini# +//binglab/Builds/search/autopilot/official/10.08.0.1114022/retail/amd64/app/AutopilotClientServiceMap.ini +\\binglab\Builds\search\autopilot\official\10.08.0.1114022\retail\amd64\app\#AutopilotClientServiceMap.ini# +c:/src/AutopilotService/autopilotService/Co1PPE/xbox-Test-co1ppe/Environment.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xbox-Test-co1ppe\#Environment.ini# +c:/src/xonline/private/common/core/mgmt/XomLogTarget.cs +c:\src\xonline\private\common\core\mgmt\#XomLogTarget.cs# +c:/src/xonline/private/setup/octopus/xdl/definition/components/inh/Cleanser.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\inh\#Cleanser.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/topologies/Sandbox.xml +c:\src\xonline\private\setup\octopus\xdl\definition\topologies\#Sandbox.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/releases/AutopilotRelease.xml +c:\src\xonline\private\setup\octopus\xdl\definition\releases\#AutopilotRelease.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/common/ConfigurePrereqs.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\common\#ConfigurePrereqs.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/common/AllMachines.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\common\#AllMachines.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/environments/sandbox.xml +c:\src\xonline\private\setup\octopus\xdl\definition\environments\#sandbox.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/common/ConfigureIIS.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\common\#ConfigureIIS.xml# +c:/src/commerce/PurchaseService/private/developer/johndoty/play/scripts/prereqs/service.xml +c:\src\commerce\PurchaseService\private\developer\johndoty\play\scripts\prereqs\#service.xml# +c:/src/xonline/private/setup/octopus/xdl/placefile +c:\src\xonline\private\setup\octopus\xdl\#placefile# +c:/src/xonline/private/setup/octopus/xdl/sources +c:\src\xonline\private\setup\octopus\xdl\#sources# +c:/src/xonline/private/setup/octopus/xdl/definition/components/common/ConfigureServer.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\common\#ConfigureServer.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/installsteps/SetupSql.xml +c:\src\xonline\private\setup\octopus\xdl\definition\installsteps\#SetupSql.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/installsteps/DbProdbase.xml +c:\src\xonline\private\setup\octopus\xdl\definition\installsteps\#DbProdbase.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/npdb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#npdb.xml# +c:/src/AutopilotService/autopilotService/Co1PPE/xbox-Test-co1ppe/machines.csv +c:\src\AutopilotService\autopilotService\Co1PPE\xbox-Test-co1ppe\#machines.csv# +c:/temp/foo.txt +c:\temp\#foo.txt# +c:/temp/zomgout/AutoXOnline/sandbox/XUser/SetupFrontEndModule.psm1 +c:\temp\zomgout\AutoXOnline\sandbox\XUser\#SetupFrontEndModule.psm1# +c:/temp/zomgout/AutoXOnline/sandbox/XUser/SetupFrontDoorModule.psm1 +c:\temp\zomgout\AutoXOnline\sandbox\XUser\#SetupFrontDoorModule.psm1# +c:/temp/zomgout/AutoXOnline/sandbox/XUser/deploymentprops.ini +c:\temp\zomgout\AutoXOnline\sandbox\XUser\#deploymentprops.ini# +c:/src/xonline/private/setup/octopus/xdl/definition/installsteps/SetupFrontDoor.xml +c:\src\xonline\private\setup\octopus\xdl\definition\installsteps\#SetupFrontDoor.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/frontdoors/Stats.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\frontdoors\#Stats.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/frontdoors/XUser.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\frontdoors\#XUser.xml# +c:/src/commerce/TokenMintingService/private/service/tokenminting/src/Deployment/servicemap.ini +c:\src\commerce\TokenMintingService\private\service\tokenminting\src\Deployment\#servicemap.ini# diff --git a/.emacs.d/auto-save-list/.saves-7104-GABRIEL-JD~ b/.emacs.d/auto-save-list/.saves-7104-GABRIEL-JD~ new file mode 100644 index 0000000..bd7ad33 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-7104-GABRIEL-JD~ @@ -0,0 +1,2 @@ +c:/temp/foo.mb +c:\temp\#foo.mb# diff --git a/.emacs.d/auto-save-list/.saves-7248-BIFROST~ b/.emacs.d/auto-save-list/.saves-7248-BIFROST~ new file mode 100644 index 0000000..16ef34a --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-7248-BIFROST~ @@ -0,0 +1,6 @@ +f:/src/DCFilters/MatroskaU/asynccb.h +f:\src\DCFilters\MatroskaU\#asynccb.h# +f:/src/DCFilters/Debug/foo.txt +f:\src\DCFilters\Debug\#foo.txt# +f:/src/DCFilters/.gitignore +f:\src\DCFilters\#.gitignore# diff --git a/.emacs.d/auto-save-list/.saves-732-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-732-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..e69de29 diff --git a/.emacs.d/auto-save-list/.saves-7384-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-7384-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..e69de29 diff --git a/.emacs.d/auto-save-list/.saves-7440-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-7440-JOHNDOTY-1~ new file mode 100644 index 0000000..559bf07 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-7440-JOHNDOTY-1~ @@ -0,0 +1,8 @@ +c:/src/commerce/PurchaseService/private/service/purchase/src/deployment/svrconfig.xml +c:\src\commerce\PurchaseService\private\service\purchase\src\deployment\#svrconfig.xml# +c:/src/commerce/PurchaseService/private/service/purchase/src/purchasefd/Microsoft/IEB/CommercialServices/Purchase/PurchaseService.cs +c:\src\commerce\PurchaseService\private\service\purchase\src\purchasefd\Microsoft\IEB\CommercialServices\Purchase\#PurchaseService.cs# +c:/src/commerce/PurchaseService/private/service/purchase/src/purchasefd/Microsoft/IEB/CommercialServices/Purchase/Contracts/IPurchaseService.cs +c:\src\commerce\PurchaseService\private\service\purchase\src\purchasefd\Microsoft\IEB\CommercialServices\Purchase\Contracts\#IPurchaseService.cs# +c:/src/sls/source/routing/main/Config/Configs/routing.config.onebox +c:\src\sls\source\routing\main\Config\Configs\#routing.config.onebox# diff --git a/.emacs.d/auto-save-list/.saves-748-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-748-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..46ed194 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-748-JOHNDOTY-USBOX~ @@ -0,0 +1,34 @@ +z:/src/vbl_srv_comtxmq/com/complus/DTC/dtc/TM/src/TmGatewaySubordinate.cpp +z:\src\vbl_srv_comtxmq\com\complus\DTC\dtc\TM\src\#TmGatewaySubordinate.cpp# +z:/src/vbl_srv_comtxmq/com/complus/DTC/dtc/TM/src/TMBROD.CPP +z:\src\vbl_srv_comtxmq\com\complus\DTC\dtc\TM\src\#TMBROD.CPP# +z:/src/vbl_srv_comtxmq/com/complus/DTC/dtc/TM/src/TMLOGREC.CPP +z:\src\vbl_srv_comtxmq\com\complus\DTC\dtc\TM\src\#TMLOGREC.CPP# +z:/src/vbl_srv_comtxmq/com/complus/DTC/dtc/TM/inc/TMLOGREC.H +z:\src\vbl_srv_comtxmq\com\complus\DTC\dtc\TM\inc\#TMLOGREC.H# +z:/src/vbl_srv_comtxmq/com/complus/DTC/dtc/TM/src/TmGatewaySuperior.cpp +z:\src\vbl_srv_comtxmq\com\complus\DTC\dtc\TM\src\#TmGatewaySuperior.cpp# +z:/src/vbl_srv_comtxmq/com/complus/DTC/dtc/TM/src/TMTX.CPP +z:\src\vbl_srv_comtxmq\com\complus\DTC\dtc\TM\src\#TMTX.CPP# +z:/src/nt/com/complus/dtc/inc/DTCCM.H +z:\src\nt\com\complus\dtc\inc\#DTCCM.H# +//cpzaw-pro-05/mydocs1/JohnDoty/notes.txt +\\cpzaw-pro-05\mydocs1\JohnDoty\#notes.txt# +z:/src/dd/indigo_wap/ndp/indigo/src/Log/System/IO/Log/LogExtentCollection.cs +z:\src\dd\indigo_wap\ndp\indigo\src\Log\System\IO\Log\#LogExtentCollection.cs# +z:/src/dd/indigo_wap/ndp/indigo/src/Log/System/IO/Log/Error.cs +z:\src\dd\indigo_wap\ndp\indigo\src\Log\System\IO\Log\#Error.cs# +z:/src/nt/com/complus/dtc/dtc/TM/inc/TMBROD.H +z:\src\nt\com\complus\dtc\dtc\TM\inc\#TMBROD.H# +z:/src/vbl_srv_comtxmq/com/complus/DTC/dtc/TM/inc/TMBROD.H +z:\src\vbl_srv_comtxmq\com\complus\DTC\dtc\TM\inc\#TMBROD.H# +z:/src/nt/com/complus/dtc/dtc/TM/inc/tmresif.h +z:\src\nt\com\complus\dtc\dtc\TM\inc\#tmresif.h# +z:/src/nt/com/complus/dtc/dtc/TM/inc/TmGatewaySubordinate.h +z:\src\nt\com\complus\dtc\dtc\TM\inc\#TmGatewaySubordinate.h# +z:/src/nt/com/complus/dtc/dtc/Mapper_IGatewayTx/src/IGatewayTx.idl +z:\src\nt\com\complus\dtc\dtc\Mapper_IGatewayTx\src\#IGatewayTx.idl# +z:/src/nt/public/sdk/inc/XOLEHLP.H +z:\src\nt\public\sdk\inc\#XOLEHLP.H# +z:/src/nt/com/complus/dtc/dtc/DTCUic/src/nonclusterglobalpage.cpp +z:\src\nt\com\complus\dtc\dtc\DTCUic\src\#nonclusterglobalpage.cpp# diff --git a/.emacs.d/auto-save-list/.saves-7560-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-7560-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..cbc4f39 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-7560-JOHNDOTY-USBOX~ @@ -0,0 +1,2 @@ +z:/src/nt/com/complus/dtc/shared/Util/msdtcsecurity.cpp +z:\src\nt\com\complus\dtc\shared\Util\#msdtcsecurity.cpp# diff --git a/.emacs.d/auto-save-list/.saves-7652-GABRIEL-JD~ b/.emacs.d/auto-save-list/.saves-7652-GABRIEL-JD~ new file mode 100644 index 0000000..d350c01 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-7652-GABRIEL-JD~ @@ -0,0 +1,2 @@ +c:/temp/priotize.txt +c:\temp\#priotize.txt# diff --git a/.emacs.d/auto-save-list/.saves-7656-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-7656-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..1a6fca4 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-7656-JOHNDOTY-USBOX~ @@ -0,0 +1,16 @@ +z:/temp/fonts2.txt +z:\temp\#fonts2.txt# +z:/src/nt/public/sdk/inc/wingdi.h +z:\src\nt\public\sdk\inc\#wingdi.h# +z:/src/nt/shell/osshell/control/console/misc.c +z:\src\nt\shell\osshell\control\console\#misc.c# +z:/src/nt/shell/osshell/control/console/registry.c +z:\src\nt\shell\osshell\control\console\#registry.c# +z:/src/nt/shell/osshell/control/console/console.h +z:\src\nt\shell\osshell\control\console\#console.h# +z:/src/nt/shell/osshell/control/console/sources +z:\src\nt\shell\osshell\control\console\#sources# +z:/src/nt/shell/osshell/control/console/fontdlg.c +z:\src\nt\shell\osshell\control\console\#fontdlg.c# +z:/src/nt/shell/osshell/control/console/console.c +z:\src\nt\shell\osshell\control\console\#console.c# diff --git a/.emacs.d/auto-save-list/.saves-7712-GABRIEL-JD~ b/.emacs.d/auto-save-list/.saves-7712-GABRIEL-JD~ new file mode 100644 index 0000000..be5bd2e --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-7712-GABRIEL-JD~ @@ -0,0 +1,10 @@ +c:/src/s7/private/Product/Framework/Microsoft.M.Library/Microsoft.M.Library.csproj +c:\src\s7\private\Product\Framework\Microsoft.M.Library\#Microsoft.M.Library.csproj# +c:/src/s7/private/Product/Framework/Microsoft.M.Library/Microsoft/M/Language/Services/CompilationResultsBase.cs +c:\src\s7\private\Product\Framework\Microsoft.M.Library\Microsoft\M\Language\Services\#CompilationResultsBase.cs# +c:/src/s7/private/Product/Framework/Microsoft.M.Library/msbuild.log +c:\src\s7\private\Product\Framework\Microsoft.M.Library\#msbuild.log# +c:/src/s7/private/Product/Framework/Microsoft.M.Library/Microsoft/TSQL10/SyntaxTree/GroupByItemKind.cs +c:\src\s7\private\Product\Framework\Microsoft.M.Library\Microsoft\TSQL10\SyntaxTree\#GroupByItemKind.cs# +c:/src/s7/private/Product/Framework/Microsoft.M.Language/Microsoft.M.Language.csproj +c:\src\s7\private\Product\Framework\Microsoft.M.Language\#Microsoft.M.Language.csproj# diff --git a/.emacs.d/auto-save-list/.saves-7788-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-7788-JOHNDOTY-1~ new file mode 100644 index 0000000..08ecea7 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-7788-JOHNDOTY-1~ @@ -0,0 +1,14 @@ +c:/src/AutopilotService/autopilotService/Co1PPE/xbox-Test-co1ppe/deployment.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xbox-Test-co1ppe\#deployment.ini# +//determinist/share/johndoty/AutoXOnline.44/servicemap.ini +\\determinist\share\johndoty\AutoXOnline.44\#servicemap.ini# +c:/temp/zomgout/AutoXOnline/sandbox/servicemap.ini +c:\temp\zomgout\AutoXOnline\sandbox\#servicemap.ini# +c:/temp/zomgout/AutoXOnline/sandbox/SgServer/SgServerModule.psm1 +c:\temp\zomgout\AutoXOnline\sandbox\SgServer\#SgServerModule.psm1# +c:/temp/zomgout/AutoXOnline/sandbox/SgServer/start.ps1 +c:\temp\zomgout\AutoXOnline\sandbox\SgServer\#start.ps1# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/npdb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#npdb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/QueryDb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#QueryDb.xml# diff --git a/.emacs.d/auto-save-list/.saves-7792-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-7792-JOHNDOTY-1~ new file mode 100644 index 0000000..3c1e8ba --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-7792-JOHNDOTY-1~ @@ -0,0 +1,2 @@ +c:/temp/foo.m +c:\temp\#foo.m# diff --git a/.emacs.d/auto-save-list/.saves-7912-GABRIEL-JD~ b/.emacs.d/auto-save-list/.saves-7912-GABRIEL-JD~ new file mode 100644 index 0000000..0563806 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-7912-GABRIEL-JD~ @@ -0,0 +1,20 @@ +c:/src/oslo/private/developer/johndoty/play/mint/mint/mint.csproj +c:\src\oslo\private\developer\johndoty\play\mint\mint\#mint.csproj# +c:/src/oslo/private/developer/johndoty/play/mint/spear/spear.csproj +c:\src\oslo\private\developer\johndoty\play\mint\spear\#spear.csproj# +c:/src/oslo/private/developer/johndoty/play/mint/spear/MainWindow.xaml.cs +c:\src\oslo\private\developer\johndoty\play\mint\spear\#MainWindow.xaml.cs# +c:/src/oslo/private/developer/johndoty/play/mint/spear/MainWindow.xaml +c:\src\oslo\private\developer\johndoty\play\mint\spear\#MainWindow.xaml# +c:/src/oslo/private/developer/johndoty/play/mint/spear/Properties/AssemblyInfo.cs +c:\src\oslo\private\developer\johndoty\play\mint\spear\Properties\#AssemblyInfo.cs# +c:/src/oslo/private/Product/QuadrantClient/Quadrant/Quadrant.csproj +c:\src\oslo\private\Product\QuadrantClient\Quadrant\#Quadrant.csproj# +c:/src/oslo/private/developer/johndoty/play/mint/mint/Microsoft/M/Host/Interpreter.cs +c:\src\oslo\private\developer\johndoty\play\mint\mint\Microsoft\M\Host\#Interpreter.cs# +c:/src/oslo/private/developer/johndoty/play/mint/mint/Microsoft/M/Host/ValueTextWriter.cs +c:\src\oslo\private\developer\johndoty\play\mint\mint\Microsoft\M\Host\#ValueTextWriter.cs# +c:/src/oslo/private/developer/johndoty/play/mint/mint/Properties/AssemblyInfo.cs +c:\src\oslo\private\developer\johndoty\play\mint\mint\Properties\#AssemblyInfo.cs# +c:/src/oslo/private/Product/Languages/mcmd/mcmd.csproj +c:\src\oslo\private\Product\Languages\mcmd\#mcmd.csproj# diff --git a/.emacs.d/auto-save-list/.saves-7944-JOHNDOTY1~ b/.emacs.d/auto-save-list/.saves-7944-JOHNDOTY1~ new file mode 100644 index 0000000..df18316 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-7944-JOHNDOTY1~ @@ -0,0 +1,2 @@ +c:/temp/foo.txt +c:\temp\#foo.txt# diff --git a/.emacs.d/auto-save-list/.saves-8124-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-8124-JOHNDOTY-1~ new file mode 100644 index 0000000..ac29321 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-8124-JOHNDOTY-1~ @@ -0,0 +1,22 @@ +c:/src/AutopilotService/autopilotService/Co1PPE/xboxprime-test-co1ppe/deployment.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xboxprime-test-co1ppe\#deployment.ini# +c:/src/xonline/private/setup/octopus/xdl/definition/topologies/expanded.xml +c:\src\xonline\private\setup\octopus\xdl\definition\topologies\#expanded.xml# +c:/src/newcommerce/Developer/JohnDoty/Play/XOnlineHealth/XOnlineHealth/XOnlineHealth.ps1 +c:\src\newcommerce\Developer\JohnDoty\Play\XOnlineHealth\XOnlineHealth\#XOnlineHealth.ps1# +c:/src/xonline/private/setup/octopus/xdl/definition/environments/xboxprime.xml +c:\src\xonline\private\setup\octopus\xdl\definition\environments\#xboxprime.xml# +c:/src/AutopilotService/autopilotService/Co1PPE/xboxprime-test-co1ppe/Environment.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xboxprime-test-co1ppe\#Environment.ini# +c:/src/AutopilotService/autopilotService/Co1PPE/xboxprime-test-co1ppe/machines.csv +c:\src\AutopilotService\autopilotService\Co1PPE\xboxprime-test-co1ppe\#machines.csv# +c:/src/AutopilotService/autopilotService/Co1PPE/xbox-Test-co1ppe/deployment.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xbox-Test-co1ppe\#deployment.ini# +c:/src/newcommerce/Developer/JohnDoty/Play/XOnlineHealth/servicemap.ini +c:\src\newcommerce\Developer\JohnDoty\Play\XOnlineHealth\#servicemap.ini# +c:/src/newcommerce/Developer/JohnDoty/Play/XOnlineHealth/XOnlineHealth/start.bat +c:\src\newcommerce\Developer\JohnDoty\Play\XOnlineHealth\XOnlineHealth\#start.bat# +c:/src/xonline/private/setup/Autopilot/XOnlineLocalWatchdog/XOnlineLocalWatchdog.ps1 +c:\src\xonline\private\setup\Autopilot\XOnlineLocalWatchdog\#XOnlineLocalWatchdog.ps1# +c:/src/xonline/private/setup/Autopilot/OpenHealthchecks/OpenHealthChecks.ps1 +c:\src\xonline\private\setup\Autopilot\OpenHealthchecks\#OpenHealthChecks.ps1# diff --git a/.emacs.d/auto-save-list/.saves-8332-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-8332-JOHNDOTY-1~ new file mode 100644 index 0000000..f56df47 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-8332-JOHNDOTY-1~ @@ -0,0 +1,28 @@ +c:/Windows/System32/drivers/etc/hosts +c:\Windows\System32\drivers\etc\#hosts# +c:/src/AutopilotService/autopilotService/Co1PPE/xbox-Test-co1ppe/Environment.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xbox-Test-co1ppe\#Environment.ini# +c:/src/xonline/private/sql/upgrade/npdb/manifest.xml +c:\src\xonline\private\sql\upgrade\npdb\#manifest.xml# +c:/src/xonline/private/sql/prodbase/npdb/deployment_int.xml +c:\src\xonline\private\sql\prodbase\npdb\#deployment_int.xml# +c:/src/AutopilotService/autopilotService/Co1PPE/xbox-Test-co1ppe/deployment.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xbox-Test-co1ppe\#deployment.ini# +c:/src/xonline/private/setup/octopus/xdl/definition/topologies/Sandbox.xml +c:\src\xonline\private\setup\octopus\xdl\definition\topologies\#Sandbox.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/frontdoors/Support.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\frontdoors\#Support.xml# +c:/src/commerce/PurchaseService/private/service/purchase/test/PurchaseTestCommon/Microsoft/Internal/LocalServer/Request.cs +c:\src\commerce\PurchaseService\private\service\purchase\test\PurchaseTestCommon\Microsoft\Internal\LocalServer\#Request.cs# +c:/src/commerce/PurchaseService/private/service/purchase/test/PurchaseTestCommon/Microsoft/Internal/LocalServer/Host.cs +c:\src\commerce\PurchaseService\private\service\purchase\test\PurchaseTestCommon\Microsoft\Internal\LocalServer\#Host.cs# +c:/src/commerce/PurchaseService/private/service/purchase/test/PurchaseTestCommon/Microsoft/Internal/LocalServer/Connection.cs +c:\src\commerce\PurchaseService\private\service\purchase\test\PurchaseTestCommon\Microsoft\Internal\LocalServer\#Connection.cs# +c:/src/xonline/private/common/core/installer/XomConfigurator.cs +c:\src\xonline\private\common\core\installer\#XomConfigurator.cs# +c:/temp/zomgout/AutoXOnline/sandbox/servicemap.ini +c:\temp\zomgout\AutoXOnline\sandbox\#servicemap.ini# +c:/temp/zomgout/AutoXOnline/sandbox/Ratings/RatingsModule.psm1 +c:\temp\zomgout\AutoXOnline\sandbox\Ratings\#RatingsModule.psm1# +c:/temp/zomgout/AutoXOnline/sandbox/Ratings/start.ps1 +c:\temp\zomgout\AutoXOnline\sandbox\Ratings\#start.ps1# diff --git a/.emacs.d/auto-save-list/.saves-8360-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-8360-JOHNDOTY-1~ new file mode 100644 index 0000000..e69de29 diff --git a/.emacs.d/auto-save-list/.saves-8396-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-8396-JOHNDOTY-1~ new file mode 100644 index 0000000..d4b5716 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-8396-JOHNDOTY-1~ @@ -0,0 +1,2 @@ +c:/src/AutopilotService/autopilotService/Co1PPE/xbox-Test-co1ppe/Environment.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xbox-Test-co1ppe\#Environment.ini# diff --git a/.emacs.d/auto-save-list/.saves-8468-GABRIEL-JD~ b/.emacs.d/auto-save-list/.saves-8468-GABRIEL-JD~ new file mode 100644 index 0000000..7cd34d9 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-8468-GABRIEL-JD~ @@ -0,0 +1,4 @@ +c:/temp/foo.c +c:\temp\#foo.c# +c:/Users/JohnDoty.REDMOND/Documents/.emacs.d/init.el +c:\Users\JohnDoty.REDMOND\Documents\.emacs.d\#init.el# diff --git a/.emacs.d/auto-save-list/.saves-8684-GABRIEL-JD~ b/.emacs.d/auto-save-list/.saves-8684-GABRIEL-JD~ new file mode 100644 index 0000000..e69de29 diff --git a/.emacs.d/auto-save-list/.saves-8732-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-8732-JOHNDOTY-1~ new file mode 100644 index 0000000..5c7d860 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-8732-JOHNDOTY-1~ @@ -0,0 +1,2 @@ +c:/Users/JohnDoty/Desktop/sqltypes.m +c:\Users\JohnDoty\Desktop\#sqltypes.m# diff --git a/.emacs.d/auto-save-list/.saves-8888-BIFROST~ b/.emacs.d/auto-save-list/.saves-8888-BIFROST~ new file mode 100644 index 0000000..acbf0d2 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-8888-BIFROST~ @@ -0,0 +1,2 @@ +c:/temp/MsiFun.ps1 +c:\temp\#MsiFun.ps1# diff --git a/.emacs.d/auto-save-list/.saves-8900-JOHNDOTY-IDES~ b/.emacs.d/auto-save-list/.saves-8900-JOHNDOTY-IDES~ new file mode 100644 index 0000000..eae4761 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-8900-JOHNDOTY-IDES~ @@ -0,0 +1,14 @@ +c:/src/oslo/target/debug35/i386/Final/Product/Binaries/GenerateUmlModel/Microsoft.Uml2/Microsoft/Uml2/OpaqueExpression.m +c:\src\oslo\target\debug35\i386\Final\Product\Binaries\GenerateUmlModel\Microsoft.Uml2\Microsoft\Uml2\#OpaqueExpression.m# +c:/src/oslo/private/tools/Build/Microsoft.Oslo.targets +c:\src\oslo\private\tools\Build\#Microsoft.Oslo.targets# +c:/src/oslo/private/Product/Tests/Checkin/Languages/dirs.proj +c:\src\oslo\private\Product\Tests\Checkin\Languages\#dirs.proj# +c:/src/oslo/public/ext/tools/Microsoft.Build.Traversal.targets +c:\src\oslo\public\ext\tools\#Microsoft.Build.Traversal.targets# +c:/src/oslo/private/Product/Tests/Checkin/Languages/msbuild.log +c:\src\oslo\private\Product\Tests\Checkin\Languages\#msbuild.log# +c:/Users/JohnDoty/Desktop/.manifest +c:\Users\JohnDoty\Desktop\#.manifest# +c:/src/oslo/private/developer/JohnDoty/play/SGRW/sgrw.txt +c:\src\oslo\private\developer\JohnDoty\play\SGRW\#sgrw.txt# diff --git a/.emacs.d/auto-save-list/.saves-904-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-904-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..a553003 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-904-JOHNDOTY-USBOX~ @@ -0,0 +1,2 @@ +z:/src/dd/indigo_wap/ndp/indigo/src/ServiceModel/System/ServiceModel/Channels/ReliableChannelListener.cs +z:\src\dd\indigo_wap\ndp\indigo\src\ServiceModel\System\ServiceModel\Channels\#ReliableChannelListener.cs# diff --git a/.emacs.d/auto-save-list/.saves-9212-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-9212-JOHNDOTY-1~ new file mode 100644 index 0000000..5035181 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-9212-JOHNDOTY-1~ @@ -0,0 +1,60 @@ +c:/src/AutopilotService/autopilotService/Co1PPE/xboxprime-test-co1ppe/Environment.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xboxprime-test-co1ppe\#Environment.ini# +c:/src/AutopilotService/autopilotService/Co1PPE/xboxprime-test-co1ppe/deployment.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xboxprime-test-co1ppe\#deployment.ini# +c:/src/xonline/private/setup/octopus/xdl/definition/topologies/expanded.xml +c:\src\xonline\private\setup\octopus\xdl\definition\topologies\#expanded.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/StoreDb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#StoreDb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/QueryDb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#QueryDb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/TUserDb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#TUserDb.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/database/XmatchDb.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\database\#XmatchDb.xml# +c:/src/xonline/private/test/deployment/TitlePropPro/TitlePropPro/TitlePropPro.cs +c:\src\xonline\private\test\deployment\TitlePropPro\TitlePropPro\#TitlePropPro.cs# +c:/src/xonline/private/test/deployment/TitlePropPro/TitlePropPro/EnvironmentData.cs +c:\src\xonline\private\test\deployment\TitlePropPro\TitlePropPro\#EnvironmentData.cs# +c:/src/newcommerce/Developer/JohnDoty/Play/TitleSync/TitleVaultSync/TitleVaultSync.ps1 +c:\src\newcommerce\Developer\JohnDoty\Play\TitleSync\TitleVaultSync\#TitleVaultSync.ps1# +c:/src/xonline/private/setup/octopus/xdl/definition/environments/xboxprime.xml +c:\src\xonline\private\setup\octopus\xdl\definition\environments\#xboxprime.xml# +//determinist/titlevault/titles/testtitles/TitleManifest.xml +\\determinist\titlevault\titles\testtitles\#TitleManifest.xml# +c:/src/commerce/Main/tools/x86/ADTScript.ps1 +c:\src\commerce\Main\tools\x86\#ADTScript.ps1# +c:/src/commerce/Main/tools/x86/ADT/ADTTools.ps1 +c:\src\commerce\Main\tools\x86\ADT\#ADTTools.ps1# +c:/temp/foo.cs +c:\temp\#foo.cs# +c:/src/newcommerce/Developer/JohnDoty/Play/TitleSync/TitleVaultSync/start.bat +c:\src\newcommerce\Developer\JohnDoty\Play\TitleSync\TitleVaultSync\#start.bat# +c:/src/newcommerce/Developer/JohnDoty/Play/TitleSync/servicemap.ini +c:\src\newcommerce\Developer\JohnDoty\Play\TitleSync\#servicemap.ini# +c:/temp/zomgout/AutoXOnline/xboxprime/servicemap.ini +c:\temp\zomgout\AutoXOnline\xboxprime\#servicemap.ini# +c:/src/newcommerce/Tools/Misc/sync-titles.ps1 +c:\src\newcommerce\Tools\Misc\#sync-titles.ps1# +c:/src/commerce/Main/private/tools/integrate/integrate.ps1 +c:\src\commerce\Main\private\tools\integrate\#integrate.ps1# +c:/Users/JohnDoty/Desktop/xboxprime/xonline.ini +c:\Users\JohnDoty\Desktop\xboxprime\#xonline.ini# +c:/src/xonline/private/server/ActiveAuth/gateway/GatewayRequest.cs +c:\src\xonline\private\server\ActiveAuth\gateway\#GatewayRequest.cs# +c:/src/xonline/private/tools/XblCfg/App/actionServer.cs +c:\src\xonline\private\tools\XblCfg\App\#actionServer.cs# +c:/src/xonline/private/setup/octopus/xdl/definition/components/inh/SgServer.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\inh\#SgServer.xml# +c:/src/newcommerce/Tools/xdlc/Main/private/src/xdlc/AutopilotSupport.psm1 +c:\src\newcommerce\Tools\xdlc\Main\private\src\xdlc\#AutopilotSupport.psm1# +c:/src/xonline/private/setup/octopus/xdl/definition/environments/sandbox.xml +c:\src\xonline\private\setup\octopus\xdl\definition\environments\#sandbox.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/common/ConfigureServer.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\common\#ConfigureServer.xml# +c:/src/xonline/private/server/sg/rawnic/sys/rnmain.cpp +c:\src\xonline\private\server\sg\rawnic\sys\#rnmain.cpp# +c:/src/xonline/private/server/sg/rawnic/sys/netrawnic.inf +c:\src\xonline\private\server\sg\rawnic\sys\#netrawnic.inf# +c:/src/xonline/private/server/sg/rawnic/lib/rnlib.cpp +c:\src\xonline\private\server\sg\rawnic\lib\#rnlib.cpp# diff --git a/.emacs.d/auto-save-list/.saves-9236-JOHNDOTY-1~ b/.emacs.d/auto-save-list/.saves-9236-JOHNDOTY-1~ new file mode 100644 index 0000000..5ab1c58 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-9236-JOHNDOTY-1~ @@ -0,0 +1,102 @@ +c:/src/xonline/private/setup/octopus/xdl/definition/releases/AutopilotRelease.xml +c:\src\xonline\private\setup\octopus\xdl\definition\releases\#AutopilotRelease.xml# +c:/temp/zomgout/AutoXOnline/sandbox/Ratings/deploymentprops.ini +c:\temp\zomgout\AutoXOnline\sandbox\Ratings\#deploymentprops.ini# +c:/temp/zomgout/AutoXOnline/sandbox/Ratings/start.ps1 +c:\temp\zomgout\AutoXOnline\sandbox\Ratings\#start.ps1# +c:/temp/zomgout/AutoXOnline/sandbox/servicemap.ini +c:\temp\zomgout\AutoXOnline\sandbox\#servicemap.ini# +c:/src/xonline/private/setup/octopus/xdl/definition/topologies/Sandbox.xml +c:\src\xonline\private\setup\octopus\xdl\definition\topologies\#Sandbox.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/frontdoors/Ratings.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\frontdoors\#Ratings.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/common/ConfigureServer.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\common\#ConfigureServer.xml# +c:/src/xonline/private/tools/XblCfg/App/actionServer.cs +c:\src\xonline\private\tools\XblCfg\App\#actionServer.cs# +c:/src/xonline/private/setup/octopus/xdl/definition/components/misc/XblobSetup.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\misc\#XblobSetup.xml# +c:/src/xonline/private/common/config/config/ConfigUtil.cs +c:\src\xonline\private\common\config\config\#ConfigUtil.cs# +c:/src/xonline/private/common/config/config/ConfigInstance.cs +c:\src\xonline\private\common\config\config\#ConfigInstance.cs# +c:/src/xonline/private/common/config/config/setupdecode.cs +c:\src\xonline\private\common\config\config\#setupdecode.cs# +c:/src/AutopilotService/autopilotService/Co1PPE/xbox-Test-co1ppe/deployment.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xbox-Test-co1ppe\#deployment.ini# +c:/src/xonline/private/setup/octopus/xdl/definition/installsteps/ConfigureVIP.xml +c:\src\xonline\private\setup\octopus\xdl\definition\installsteps\#ConfigureVIP.xml# +c:/temp/zomgout/AutoXOnline/sandbox/ActiveAuth/ConfigureVIPModule.psm1 +c:\temp\zomgout\AutoXOnline\sandbox\ActiveAuth\#ConfigureVIPModule.psm1# +c:/temp/zomgout/AutoXOnline/sandbox/ActiveAuth/start.ps1 +c:\temp\zomgout\AutoXOnline\sandbox\ActiveAuth\#start.ps1# +c:/temp/zomgout/AutoXOnline/sandbox/ActiveAuth/deploymentprops.ini +c:\temp\zomgout\AutoXOnline\sandbox\ActiveAuth\#deploymentprops.ini# +c:/src/xonline/private/setup/octopus/xdl/definition/installsteps/SetupFrontDoor.xml +c:\src\xonline\private\setup\octopus\xdl\definition\installsteps\#SetupFrontDoor.xml# +c:/temp/zomgout/AutoXOnline/sandbox/ActiveAuth/ActiveAuthModule.psm1 +c:\temp\zomgout\AutoXOnline\sandbox\ActiveAuth\#ActiveAuthModule.psm1# +c:/temp/zomgout/AutoXOnline/sandbox/ActiveAuth/SetupFrontDoorModule.psm1 +c:\temp\zomgout\AutoXOnline\sandbox\ActiveAuth\#SetupFrontDoorModule.psm1# +c:/temp/zomgout/AutoXOnline/sandbox/ConfigureIIS/deploymentprops.ini +c:\temp\zomgout\AutoXOnline\sandbox\ConfigureIIS\#deploymentprops.ini# +c:/temp/zomgout/AutoXOnline/sandbox/ConfigureIIS/ConfigureIISModule.psm1 +c:\temp\zomgout\AutoXOnline\sandbox\ConfigureIIS\#ConfigureIISModule.psm1# +c:/temp/zomgout/AutoXOnline/sandbox/ActiveAuth/InstallPropCertModule.psm1 +c:\temp\zomgout\AutoXOnline\sandbox\ActiveAuth\#InstallPropCertModule.psm1# +c:/src/commerce/PurchaseService/private/tools/xdlc/AutopilotSupport.psm1 +c:\src\commerce\PurchaseService\private\tools\xdlc\#AutopilotSupport.psm1# +c:/src/xonline/private/setup/octopus/xdl/definition/components/common/ConfigureIIS.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\common\#ConfigureIIS.xml# +c:/src/commerce/PurchaseService/private/developer/johndoty/play/scripts/prereqs/service.xml +c:\src\commerce\PurchaseService\private\developer\johndoty\play\scripts\prereqs\#service.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/installsteps/SetupINH.xml +c:\src\xonline\private\setup\octopus\xdl\definition\installsteps\#SetupINH.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/common/AllMachines.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\common\#AllMachines.xml# +c:/src/xonline/private/common/servhlp/ntsvc/ntservice.cpp +c:\src\xonline\private\common\servhlp\ntsvc\#ntservice.cpp# +c:/src/xonline/private/common/config/config/Npdb.cs +c:\src\xonline\private\common\config\config\#Npdb.cs# +c:/src/xonline/private/common/config/config/ComponentInfo.cs +c:\src\xonline\private\common\config\config\#ComponentInfo.cs# +c:/temp/zomgout/AutoXOnline/ActiveAuth/tools/setupntsvc.vbs +c:\temp\zomgout\AutoXOnline\ActiveAuth\tools\#setupntsvc.vbs# +c:/src/xonline/private/setup/octopus/xdl/definition/installsteps/SetupFrontEnd.xml +c:\src\xonline\private\setup\octopus\xdl\definition\installsteps\#SetupFrontEnd.xml# +c:/src/commerce/PurchaseService/private/tools/xdlc/Language/schema.xsd +c:\src\commerce\PurchaseService\private\tools\xdlc\Language\#schema.xsd# +c:/temp/zomgout/AutoXOnline/ActiveAuth/deploymentprops.ini +c:\temp\zomgout\AutoXOnline\ActiveAuth\#deploymentprops.ini# +c:/temp/zomgout/AutoXOnline/ConfigureServer/deploymentprops.ini +c:\temp\zomgout\AutoXOnline\ConfigureServer\#deploymentprops.ini# +c:/src/AutopilotService/autopilotService/Co1PPE/xbox-Test-co1ppe/Environment.ini +c:\src\AutopilotService\autopilotService\Co1PPE\xbox-Test-co1ppe\#Environment.ini# +c:/temp/octopustoap.ps1 +c:\temp\#octopustoap.ps1# +c:/Users/JohnDoty/Desktop/Setup ActiveAuth_0.log +c:\Users\JohnDoty\Desktop\#Setup ActiveAuth_0.log# +c:/Users/JohnDoty/Desktop/msi.log +c:\Users\JohnDoty\Desktop\#msi.log# +c:/src/xonline/private/setup/octopus/xdl/definition/components/frontdoors/ActiveAuth.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\frontdoors\#ActiveAuth.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/components/common/SiteConfiguration.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\common\#SiteConfiguration.xml# +c:/src/xonline/drop/merged/msi/esp/_2011 Oct SR Main/service.xml +c:\src\xonline\drop\merged\msi\esp\_2011 Oct SR Main\#service.xml# +c:/src/xonline/drop/merged/msi/esp/service.xml +c:\src\xonline\drop\merged\msi\esp\#service.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/installsteps/PropCert.xml +c:\src\xonline\private\setup\octopus\xdl\definition\installsteps\#PropCert.xml# +c:/src/xonline/drop/merged/msi/esp/configuration/xblob/configuration.xml +c:\src\xonline\drop\merged\msi\esp\configuration\xblob\#configuration.xml# +c:/src/xonline/drop/merged/msi/esp/configuration/xblob/config-template.xml +c:\src\xonline\drop\merged\msi\esp\configuration\xblob\#config-template.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/Properties.xml +c:\src\xonline\private\setup\octopus\xdl\definition\#Properties.xml# +c:/src/xonline/private/setup/octopus/setuplogging.cmd +c:\src\xonline\private\setup\octopus\#setuplogging.cmd# +c:/src/xonline/private/setup/octopus/xdl/definition/components/widgets/ContentIngestion.xml +c:\src\xonline\private\setup\octopus\xdl\definition\components\widgets\#ContentIngestion.xml# +c:/src/xonline/private/setup/octopus/xdl/definition/releases/TestComponents.xml +c:\src\xonline\private\setup\octopus\xdl\definition\releases\#TestComponents.xml# diff --git a/.emacs.d/auto-save-list/.saves-9256-BIFROST~ b/.emacs.d/auto-save-list/.saves-9256-BIFROST~ new file mode 100644 index 0000000..27336d5 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-9256-BIFROST~ @@ -0,0 +1,2 @@ +f:/Users/John/Desktop/Toolkit-release/Input/AutoCompleteBox/System/Windows/Controls/AutoCompleteBox.cs +f:\Users\John\Desktop\Toolkit-release\Input\AutoCompleteBox\System\Windows\Controls\#AutoCompleteBox.cs# diff --git a/.emacs.d/auto-save-list/.saves-9396-JOHNDOTY-IDES~ b/.emacs.d/auto-save-list/.saves-9396-JOHNDOTY-IDES~ new file mode 100644 index 0000000..37a7139 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-9396-JOHNDOTY-IDES~ @@ -0,0 +1,2 @@ +c:/temp/notes.txt +c:\temp\#notes.txt# diff --git a/.emacs.d/auto-save-list/.saves-9536-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-9536-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..cc62191 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-9536-JOHNDOTY-USBOX~ @@ -0,0 +1,10 @@ +z:/temp/backup/subs.txt +z:\temp\backup\#subs.txt# +z:/src/nt/com/complus/dtc/shared/Trace/src/TraceOutputSettings.cpp +z:\src\nt\com\complus\dtc\shared\Trace\src\#TraceOutputSettings.cpp# +z:/src/nt/com/complus/comres/msdtcprx.rc2 +z:\src\nt\com\complus\comres\#msdtcprx.rc2# +//Tkzaw-pro-18/Mydocs3/JohnDoty/My Documents/.emacs +\\Tkzaw-pro-18\Mydocs3\JohnDoty\My Documents\#.emacs# +z:/src/nt/com/complus/dtc/dtc/DTCUic/src/traceconfigurationpage.cpp +z:\src\nt\com\complus\dtc\dtc\DTCUic\src\#traceconfigurationpage.cpp# diff --git a/.emacs.d/auto-save-list/.saves-9668-JOHNDOTY-USBOX~ b/.emacs.d/auto-save-list/.saves-9668-JOHNDOTY-USBOX~ new file mode 100644 index 0000000..9ca2760 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-9668-JOHNDOTY-USBOX~ @@ -0,0 +1,26 @@ +//Tkzaw-pro-18/Mydocs3/JohnDoty/My Documents/.emacs +\\Tkzaw-pro-18\Mydocs3\JohnDoty\My Documents\#.emacs# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/comdll.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#comdll.cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/msdtcprx.def +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#msdtcprx.def# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/DllGetTmCore.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#DllGetTmCore.cpp# +z:/src/nt/public/sdk/inc/windef.h +z:\src\nt\public\sdk\inc\#windef.h# +z:/src/nt/public/sdk/inc/windows.h +z:\src\nt\public\sdk\inc\#windows.h# +z:/src/nt/public/sdk/inc/winbase.h +z:\src\nt\public\sdk\inc\#winbase.h# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/inc/dtcprx.h +z:\src\nt\com\complus\dtc\dtc\msdtcprx\inc\#dtcprx.h# +z:/src/misc/freeandreturn.cpp +z:\src\misc\#freeandreturn.cpp# +z:/src/nt/com/complus/dtc/dtc/msdtcprx/src/dtcprx.cpp +z:\src\nt\com\complus\dtc\dtc\msdtcprx\src\#dtcprx.cpp# +z:/src/nt/com/complus/dtc/dtc/XOleHlp/XOLEHLP.CPP +z:\src\nt\com\complus\dtc\dtc\XOleHlp\#XOLEHLP.CPP# +z:/src/nt/testsrc/comtest/lh/dtc/DevSuites/ProxyUnload/proxyunload.cpp +z:\src\nt\testsrc\comtest\lh\dtc\DevSuites\ProxyUnload\#proxyunload.cpp# +z:/src/nt/testsrc/comtest/lh/dtc/DevSuites/ProxyUnload/sources +z:\src\nt\testsrc\comtest\lh\dtc\DevSuites\ProxyUnload\#sources# diff --git a/.emacs.d/elpa/archive-contents b/.emacs.d/elpa/archive-contents new file mode 100644 index 0000000..0a78835 --- /dev/null +++ b/.emacs.d/elpa/archive-contents @@ -0,0 +1,447 @@ +(1 + (load-relative . + [(0 1) + nil "relative file load (within a multi-file Emacs package)" single]) + (test-unit . + [(0 1) + nil "Unit Test Framework for Emacs Lisp " single]) + (zenburn . + [(1 8) + nil "just some alien fruit salad to keep you in the zone" single]) + (multi-project . + [(0 0 1) + nil "Work with multiple projects" single]) + (hungry-delete . + [(1 0) + nil "hungry delete minor mode" single]) + (Save-visited-files . + [(1 2) + nil "save opened files across sessions" single]) + (c-eldoc . + [(0 6) + nil "helpful description of the arguments to C functions" single]) + (mv-shell . + [(1 0) + nil "keep buffers in sync with filename throughout 'mv'commands in shell-mode." single]) + (diff-git . + [(0 1 1) + nil "Git integration with diff-mode" single]) + (html-script-src . + [(0 0 2) + nil "Insert ")) + (script "v" "")) + (script "%" "<%=" "ASP output" + ("<%="(p " Variabile: ")"%>")) + (script "a" "<%xx%>" "ASP code" + ("<%\n"(r "Code: " )"\n%>")) + (script "<" "<%xx%>" "ASP break" + ("%>\n"(r "Code: " )"\n<%")) + (script "=" "")) + (script "p" "" "PHP code" + ("")) + (script "?" "" "PHP break" + ("?>\n"(r " Code: " )"\n and those in dictionaries
..
+;; This command will insert the appropriate one depending on context. + +(defun html-helper-smart-insert-item (&optional arg) + "Insert a new item, either in a regular list or a dictionary." + (interactive "*P") + (let ((case-fold-search t)) + (if + (save-excursion + (re-search-backward "
  • \\|
    \\|
      \\|
        \\|
        \\|\\|\\|
        " nil t) + (looking-at "
        \\|
        \\|
        ")) + (tempo-template-html-definition-item arg) + (tempo-template-html-list-item arg)))) + +;; special keybindings in the prefix maps (not in the list of tags) +(and (boundp 'html-helper-list-map) + (define-key html-helper-list-map "i" 'html-helper-smart-insert-item)) + +;; and, special menu bindings +(and (boundp 'html-helper-list-menu) + (setq html-helper-list-menu + (cons '["List Item" html-helper-smart-insert-item t] html-helper-list-menu))) + +;;}}} + +;;{{{ menu support + +;; menus are built for easymenu. html-helper-add-tag builds +;; submenus based on tag type, the expert menu code lumps them +;; together into one list and calls easy-menu-define + +(defvar html-helper-novice-menu + '("HTML" + ["Insert Paragraph" tempo-template-html-paragraph t] + ["Insert Hyperlink" tempo-template-html-hyperlink t] + ["Insert Big Header" tempo-template-html-header-2 t] + ["Insert Unordered List" tempo-template-html-unordered-list t] + ["Insert List Item" html-helper-smart-insert-item t] + ["Insert Inlined Image" tempo-template-html-image-with-alternate-text t] + ["Turn on Expert Menu" html-helper-toggle-expert-menu t]) + "Menu for novices, only installed if `html-helper-use-expert-menu is nil'") + +(defun html-helper-menu nil + "Return the proper menu. Looks at `html-helper-use-expert-menu'" + (if html-helper-use-expert-menu + (html-helper-expert-menu) + html-helper-novice-menu)) + +(defun html-helper-rebuild-menu nil + "Rebuild and install the HTML menu (using `easy-menu-define'). +If `html-helper-use-expert-menu' is nil, then just use a novice menu." + (let ((menu (html-helper-menu))) + (easy-menu-remove menu) + (easy-menu-define html-helper-mode-menu-symbol + html-helper-mode-map "HTML menus" menu) + (easy-menu-add menu html-helper-mode-map))) + +(defun html-helper-toggle-expert-menu (&optional arg) + "Toggle full HTML menus. Optional arg acts like minor-mode args." + (interactive "P") + (setq html-helper-use-expert-menu + (if (null arg) (not html-helper-use-expert-menu) + (> (prefix-numeric-value arg) 0))) + (html-helper-rebuild-menu)) + +;; If browse-url loaded, add this in the novice menu. +(if (fboundp 'browse-url-of-file) + (setq html-helper-novice-menu + (append html-helper-novice-menu + (list ["Load This Buffer in Browser" browse-url-of-file t])))) + +;; Narrrowing to scripts, this don't use tempo because has to call functions +;; and not insert templates + + +;; Expert menus: consed up out of html-helper-installed-types +(defun html-helper-expert-menu () + "This menu is based on the current value of `html-helper-installed-types'. +This function can be called again, it redoes the entire menu." + ;; first, reset this so we can call this again and again. + (setq html-helper-mode-menu nil) + + ;; Cons in the toggle of the menu + (setq html-helper-mode-menu + (cons '["Turn on Novice Menu" + html-helper-toggle-expert-menu t] + html-helper-mode-menu)) + + ;; Now add in user-provided menu stuff + (setq html-helper-mode-menu + (append html-helper-user-menu html-helper-mode-menu)) + + ;; Now cons in the browse-url functions + (if (fboundp 'browse-url-of-file) + (setq html-helper-mode-menu + (cons '["Load this Buffer in Browser" browse-url-of-file t] + html-helper-mode-menu))) + (if (and (boundp 'browse-url-browser-function) (fboundp browse-url-browser-function)) + (setq html-helper-mode-menu + (cons (vector "Browse URL at point" browse-url-browser-function t) + html-helper-mode-menu))) + + ;; cons in the timestamp delimiters + (setq html-helper-mode-menu + (cons '["Insert Timestamp Delimiter" + html-helper-insert-timestamp-delimiter-at-point t] + html-helper-mode-menu)) + + ;; cons in the C# script block insert + (setq html-helper-mode-menu + (cons '["Insert CSharp Script Block" + html-helper-insert-csharp-script-tag t] + html-helper-mode-menu)) + + ;; cons script narrowing + (setq html-helper-mode-menu + (append html-helper-mode-menu + (list ["Narrow to ASP" html-script-narrow-to-asp t]))) + (setq html-helper-mode-menu + (append html-helper-mode-menu + (list ["Narrow to PHP" html-script-narrow-to-php t]))) + (setq html-helper-mode-menu + (append html-helper-mode-menu + (list ["Narrow to VBScript" html-script-narrow-to-vbscript t]))) + (setq html-helper-mode-menu + (append html-helper-mode-menu + (list ["Narrow to JavaScript" html-script-narrow-to-javascript t]))) + (setq html-helper-mode-menu + (append html-helper-mode-menu + (list ["Narrow to CSharp" html-script-narrow-to-csharp t]))) + + ;; now cons up the main menu out of the submenus + (mapcar + (function (lambda (type) + (setq html-helper-mode-menu + (cons (html-helper-normalized-menu-for type) + html-helper-mode-menu)))) + html-helper-installed-types) + + ;; now tack on our name + (setq html-helper-mode-menu (cons "HTML" html-helper-mode-menu)) + html-helper-mode-menu) + +(html-helper-rebuild-menu) + +;;}}} + +;;{{{ context guessing + +;; guess where we are in indented lists based on the last list token. +;; it would be much better to try to match
    to
      , and to
        +;; etc, but that is pretty unwieldy and slow. +;; Note, we make select/option look like a list structure too, so indentation +;; works. This is a bit weird, but it's ok. + +(defvar html-helper-any-list-item-start "
      1. \\|
        \\|
        \\|\\|") +(defvar html-helper-any-list-item-end "
      2. \\|
    \\|
  • \\|\\|") +(defvar html-helper-any-list-start "
    \\|
    \\|\\|\\|\\|\\|\\|\\|") +(defvar html-helper-any-list + (format "\\(%s\\)\\|\\(%s\\)\\|\\(%s\\)\\|\\(%s\\)" + html-helper-any-list-start + html-helper-any-list-end + html-helper-any-list-item-start + html-helper-any-list-item-end)) + +(defvar html-helper-indentation-list + (format "\\(%s\\)\\|\\(%s\\)\\|\\(%s\\)" + html-helper-any-list-start + html-helper-any-list-end + html-helper-any-list-item-start)) +(defvar html-helper-search-limit 2000 "limit on how far back we search") + +(defun html-helper-context-symbol () + "Return the symbol the last match (against `html-helper-any-list') found." + (cond ((match-beginning 1) 'list-start) + ((match-beginning 2) 'list-end) + ((match-beginning 3) 'item-start) + ((match-beginning 4) 'item-end) + (t 'error))) + +(defun html-helper-guess-prev-context () + "Figure out the last list-type tag before point relevant to indentation. +Returns 'item-start if the last list tag is a list item start + 'start if the last list tag is the start of a list + 'end if the last list tag is the end of a list. +Ignores list item ends, because those aren't reliable for indentation." + (save-excursion + (let* ((lim (max (point-min) (- (point) html-helper-search-limit))) + (context (if (re-search-backward html-helper-indentation-list lim t) + (html-helper-context-symbol) + nil))) + (cons context (current-indentation))))) + +(defun html-helper-print-prev-context () + (interactive) + (message "%s" (html-helper-guess-prev-context))) + +;;}}} + +;;{{{ indentation + +(defvar html-helper-print-indent-info nil + "If t, indent will print out information as a message.") + +(defun html-helper-indent-command () + "Command for indenting HTML to the appropriate column. +Calls `html-helper-indent' which tries to examine how many levels down +in nested lists we are and does the appropriate indentation.' +See also `html-helper-basic-offset', `html-helper-item-continue-indent', +and `html-helper-never-indent'." + (interactive) + (html-helper-indent)) + +;; some ideas borrowed from cc-mode.el. +;; Basic logic: +;; if this line is some sort of list token, indent according to prev context: +;; if previous context was a list-end or item-start, use its indentation +;; if previous context was a list start, indent forward basic-offset +;; ignore previous list-ends, their indentation is unreliable. +;; then if this is some sort of list-item, do special case fixups: +;; if this is a item start or end and previous was a list end, go back +;; item-continue-indent (the is probably indented for an
  • +;; if this is a list end and previous was a list end, go back +;; item-continue-indent (the is probably indented for an
  • +;; if this is a list end and prev *not* a list end, go back basic-offset +;; else if this line is not a list item, and previous line is a item-start +;; indent continue-indent, because this is part of the item + +;; code to never indent
     sections. Many thanks to 
    +;; Stan Lanning 
    +(defun html-helper-indent-leave-alone-p ()
    +  (let* ((pre (save-excursion (search-backward "
    " nil t)))
    +	 (endpre (save-excursion (search-backward "
    " pre t)))) + (and pre (null endpre)))) + +(defadvice html-helper-indent (around leave-pre-alone activate) + (cond ((not (html-helper-indent-leave-alone-p)) + ad-do-it) + (html-helper-print-indent-info + (message "In
     -- skipping indentation"))
    +	(t nil)))
    +
    +(defun html-helper-indent ()
    +  "Indentation workhorse function."
    +  (if html-helper-never-indent
    +      ()
    +    (let ((m (point-marker))
    +	  (bol (progn (beginning-of-line) (point))))
    +
    +      ;; unindent the line
    +      (delete-region (point) (progn (back-to-indentation) (point)))
    +
    +      (let* ((where (html-helper-guess-prev-context))
    +	     (prev-context (car where))
    +	     (this-context nil)
    +	     (previ (cdr where))
    +	     (newi (cond 
    +		    ((eq prev-context 'list-end) previ)
    +		    ((eq prev-context 'item-start) previ)
    +		    ((eq prev-context 'list-start) (+ previ html-helper-basic-offset))
    +		    (t previ))))
    +
    +	;; newi is set to the basic indentation, now adjust indentation
    +	;; based on what the current line is.
    +	(if (looking-at html-helper-any-list)
    +	    (progn
    +	      (setq this-context (html-helper-context-symbol))
    +	      (cond
    +	       ;; item start or end and last line was a list-end: go backwards
    +	       ((and
    +		 (or (eq this-context 'item-start) (eq this-context 'item-end))
    +		 (eq prev-context 'list-end))
    +		(setq newi (- newi html-helper-item-continue-indent)))
    +	       
    +	       ;; end of list and last line was an end: go backwards twice
    +	       ((and (eq this-context 'list-end) (eq prev-context 'list-end))
    +		(setq newi (- newi html-helper-item-continue-indent html-helper-basic-offset)))
    +	       
    +	       ;; Any other end of list? Indent negative
    +	       ((and (eq this-context 'list-end))
    +		(setq newi (- newi html-helper-basic-offset)))
    +	       
    +	       ;; start of list and last line beginning of item, go forwards
    +	       ((and (eq this-context 'list-start) (eq prev-context 'item-start))
    +		(setq newi (+ newi html-helper-item-continue-indent)))))
    +	  
    +	  ;; default: no special case, indent forward for text
    +	  (cond
    +	   ;; last line an item? Beginning of continued item - go forward
    +	   ((eq prev-context 'item-start)
    +	    (setq newi (+ newi html-helper-item-continue-indent)))))
    +
    +	(if html-helper-print-indent-info
    +	    (message "Last Context: %s, This Context: %s, Previous: %s New: %s" prev-context this-context previ newi))
    +	
    +	;; just in case
    +	(if (< newi 0)
    +	    (setq newi 0))
    +	(indent-to newi newi)
    +	
    +	;; adjust point to where it was before, or at start of indentation
    +	(goto-char (marker-position m))
    +	(if (< (current-column) (current-indentation))
    +	    (back-to-indentation))))))
    +
    +;;}}}
    +
    +;;{{{ completion finder for tempo
    +
    +(defvar html-helper-completion-finder
    +  (if html-helper-emacs18
    +      'html-helper-emacs18-completion-finder
    +    "\\(\\(<\\|&\\).*\\)\\=")
    +  "Passed to tempo-use-tag-list, used to find tags to complete.")
    +
    +;; The regexp finds everything between the last < or & and point,
    +;; which is good enough to match the tags HTML might complete.
    +;; emacs18 doesn't have the \= for regexps, though, so we do something
    +;; more hackish.
    +
    +(defun html-helper-emacs18-completion-finder ()
    +  "Unfortunately emacs18 doesn't support \\= in regexps, so we do this hack.
    +If you have problems with it, maybe you should upgrade to emacs19 :-)"
    +  (let* ((where nil)
    +         (s (buffer-substring
    +             (point)
    +             (setq where (save-excursion
    +                           (re-search-backward "<\\|&" (min (point-min) 100) t)
    +                           (point))))))
    +    (cons s where)))
    +
    +;;}}}
    +
    +;;{{{ timestamps
    +
    +(defun html-helper-update-timestamp ()
    +  "Basic function for updating timestamps.
    +It finds the timestamp in the buffer by looking for
    +`html-helper-timestamp-start', deletes all text up to
    +`html-helper-timestamp-end', and runs `html-helper-timestamp-hook' which
    +will should insert an appropriate timestamp in the buffer."
    +  (save-excursion
    +    (goto-char (point-max))
    +    (if (not (search-backward html-helper-timestamp-start nil t))
    +	(message "timestamp delimiter start was not found")
    +      (let ((ts-start (+ (point) (length html-helper-timestamp-start)))
    +	    (ts-end (if (search-forward html-helper-timestamp-end nil t)
    +			(- (point) (length html-helper-timestamp-end))
    +		      nil)))
    +	(if (not ts-end)
    +	    (message "timestamp delimiter end was not found. Type C-c C-t to insert one.")
    +	  (delete-region ts-start ts-end)
    +	  (goto-char ts-start)
    +	  (run-hooks 'html-helper-timestamp-hook)))))
    +  nil)
    +
    +(defun html-helper-default-insert-timestamp ()
    +  "Default timestamp insertion function."
    +  (let ((time (current-time-string)))
    +    (insert "Last modified: "
    +	    (substring time 0 20)
    +	    (nth 1 (current-time-zone))
    +	    " "
    +	    (substring time -4)
    +	    " ")))
    +
    +(defun html-helper-insert-timestamp-delimiter-at-point ()
    +  "Simple function that inserts timestamp delimiters at point.
    +Useful for adding timestamps to existing buffers."
    +  (interactive)
    +  (insert html-helper-timestamp-start)
    +  (insert html-helper-timestamp-end))
    +
    +;;}}}
    +
    +;;{{{ html-helper-insert-new-buffer-strings
    +
    +(tempo-define-template "html-skeleton" html-helper-new-buffer-template
    +		       nil
    +		       "Insert a skeleton for a HTML document")
    +
    +(tempo-define-template "ASP-skeleton" html-helper-new-ASP-buffer-template
    +		       nil
    +		       "Insert a skeleton for a ASP document")
    +
    +(tempo-define-template "ASPX-skeleton" html-helper-new-ASPX-buffer-template
    +		       nil
    +		       "Insert a skeleton for a ASPX document")
    +
    +(tempo-define-template "PHP-skeleton" html-helper-new-PHP-buffer-template
    +		       nil
    +		       "Insert a skeleton for a PHP document")
    +
    +(defun html-helper-insert-new-buffer-strings ()
    +  "Insert `html-helper-new-buffer-strings'."
    +  (tempo-template-html-skeleton))
    +
    +(defun html-helper-insert-new-ASP-buffer-strings ()
    +  "Insert `html-helper-new-ASP-buffer-strings'."
    +  (tempo-template-ASP-skeleton))
    +
    +(defun html-helper-insert-new-ASPX-buffer-strings ()
    +  "Insert `html-helper-new-ASPX-buffer-strings'."
    +  (tempo-template-ASPX-skeleton))
    +
    +(defun html-helper-insert-new-PHP-buffer-strings ()
    +  "Insert `html-helper-new-PHP-buffer-strings'."
    +  (tempo-template-PHP-skeleton))
    +
    +
    +(defun html-helper-insert-csharp-script-tag ()
    +  "Insert a C# script block"
    +  (interactive)
    +  (insert "")
    +  (search-backward "\n" nil t)
    +)
    +;;}}}
    +
    +;;{{{ html-helper-mode
    +
    +(defun base-html-helper-mode (mode)
    +  "basic mode, called by the exported modes with MODE telling what 
    +is the mode to run (that's the skeleton to insert in empty files)"
    +  (kill-all-local-variables)
    +
    +  (use-local-map html-helper-mode-map)
    +  (setq local-abbrev-table html-helper-mode-abbrev-table)
    +  (set-syntax-table html-helper-mode-syntax-table)
    +
    +  (make-local-variable 'comment-start)
    +  (make-local-variable 'comment-end)
    +  (make-local-variable 'comment-column)
    +  (make-local-variable 'comment-start-skip)
    +  (make-local-variable 'indent-line-function)
    +  (make-local-variable 'html-helper-count)
    +  (make-local-variable 'html-helper-mode-local-JSP-not-ASP)
    +
    +  ;; font-lock setup for various emacsen: XEmacs, Emacs 19.29+, Emacs <19.29.
    +  ;; By Ulrik Dickow .  (Last update: 05-Sep-1995).
    +  (cond	((string-match "XEmacs\\|Lucid" (emacs-version)) ; XEmacs/Lucid
    +	 (put major-mode 'font-lock-keywords-case-fold-search t))
    +	;; XEmacs (19.13, at least) guesses the rest correctly.
    +	;; If any older XEmacsen don't, then tell me.
    +	;;
    +	((string-lessp "19.28.89" emacs-version) ; Emacs 19.29 and later
    +	 (make-local-variable 'font-lock-defaults)
    +	 (setq font-lock-defaults '(html-helper-font-lock-keywords t t)))
    +	;;
    +	(t ; Emacs 19.28 and older
    +	 (make-local-variable 'font-lock-keywords-case-fold-search)
    +	 (make-local-variable 'font-lock-keywords)
    +	 (make-local-variable 'font-lock-no-comments)
    +	 (setq font-lock-keywords-case-fold-search t)
    +	 (setq font-lock-keywords html-helper-font-lock-keywords)
    +	 (setq font-lock-no-comments t)))
    +
    +  (setq comment-start ""
    +	comment-start-skip "', but also e.g the single, complete declaration
    +     ;; `c3 (still comment) ----c4- c4--   >'.
    +     ;; Note that e.g. Netscape 3.01 Gold doesn't fully live up to the spec.
    +    '("" 0 font-lock-comment-face t)))
    +    "Additional expressions to highlight in HTML helper mode.")
    +
    +;; internal variables
    +
    +(defvar html-helper-count 0 "Counter during server script matching")
    +
    +(defvar html-helper-verbose t 
    +  "Non nil to show a counter during server script matching")
    +
    +;; Function to match an asp script (hopefully) without overflowing the
    +;; regexp stack (not inline <%= ... %>)
    +;;
    +;;
    +(defun html-helper-match-asp-php (last)
    +  (cond (html-helper-verbose
    +	 (message "Fontifying %s... (PHP/ASP..%s)" bufname (make-string (incf html-helper-count) ?.))))
    +  (cond ((search-forward-regexp "[^\"]<[?%][^=]" last t) ; match inline elsewhere
    +	 (backward-char 1)
    +	 (let ((beg (point)))
    +;	   (cond ((search-forward-regexp "\\([^%?\n]\\|[%?][^>]\\|\\(\"\\([%?]>\\|.\\)*\"\\)\\)*[?%]>" last t)
    +	   (cond ((search-forward-regexp "\\([^\%\?\n\"]\\|[%?][^>]\\)*[?%]>" last t)
    +		  (set-match-data (list beg (point)))
    +		  t )
    +		 (t nil))))
    +	(t nil)))
    +
    +(defun html-helper-fontify-region (beg end verbose)
    +  (setq html-helper-count 0)
    +  (let ((loudly (and verbose
    +		     (> (- end beg) (/ (buffer-size) 2)))))
    +    (setq html-helper-verbose loudly)
    +    (font-lock-default-fontify-region beg end loudly)))
    +
    +(set (make-local-variable font-lock-fontify-region-function) 
    +     'html-helper-fontify-region)
    +
    +(defun html-helper-fontify-buffer ()
    +  (setq html-helper-count 0)
    +  (setq html-helper-verbose (if (numberp font-lock-verbose)
    +				(> (buffer-size) font-lock-verbose)
    +			      font-lock-verbose))
    +  (font-lock-default-fontify-buffer))
    +
    +(set (make-local-variable font-lock-fontify-buffer-function) 
    +     'html-helper-fontify-buffer)
    +
    +;;}}} faces
    +
    +;;{{{ patterns for hilit19
    +
    +;; Define some useful highlighting patterns for the hilit19 package.
    +;; These will activate only if hilit19 has already been loaded.
    +;; Thanks to  for some pattern suggestions
    +
    +(if (featurep 'hilit19)
    +    (hilit-set-mode-patterns
    +     'html-helper-mode
    +     '(("" comment)
    +       ("[^<>]*\\(<[^>]*>[^<>]*\\)*>" nil comment) ;
    +       ("" "" defun)
    +       ("" "" bold) ;only colour inside tag
    +       ("" define)
    +       ("" nil define)
    +       ("" include)
    +       ("" include)
    +       ;; First  highlighting just handles unnested tags, then do nesting
    +       ("[^<]*" nil italic)
    +       ("" "" bold)
    +       ("" "" italic)
    +       ("" "" underline)
    +       ("&[^;\n]*;" nil string)
    +       ;; w3 org says that a tag is  not < element-name>
    +       ("<[^ \t]" ">" keyword))
    +     nil 'case-insensitive)
    +  nil)
    +;; These are for supporting html-script. With small changes can be useful for
    +;; javascript
    +
    +
    +;;{{{ context guessing
    +
    +;; guess where we are in indented lists based on the last list token.
    +;; it would be much better to try to match  to 
      , and to
        +;; etc, but that is pretty unwieldy and slow. +;; Note, we make select/option look like a list structure too, so indentation +;; works. This is a bit weird, but it's ok. + +(defvar html-helper-any-list-item-start "
      1. \\|
        \\|
        \\|\\|") +(defvar html-helper-any-list-item-end "
      2. \\|\\|\\|\\|") +(defvar html-helper-any-list-start "
        \\|
          \\|
            \\|\\|\\|") +(defvar html-helper-any-list-end "
        \\|
    \\|\\|\\|\\|\\|\\|") +(defvar html-helper-any-list + (format "\\(%s\\)\\|\\(%s\\)\\|\\(%s\\)\\|\\(%s\\)" + html-helper-any-list-start + html-helper-any-list-end + html-helper-any-list-item-start + html-helper-any-list-item-end)) + +(defvar html-helper-indentation-list + (format "\\(%s\\)\\|\\(%s\\)\\|\\(%s\\)" + html-helper-any-list-start + html-helper-any-list-end + html-helper-any-list-item-start)) +(defvar html-helper-search-limit 2000 "limit on how far back we search") + +;;}}} +;;{{{ indentation + +(defvar html-helper-print-indent-info nil + "If t, indent will print out information as a message.") + +;; some ideas borrowed from cc-mode.el. +;; Basic logic: +;; if this line is some sort of list token, indent according to prev context: +;; if previous context was a list-end or item-start, use its indentation +;; if previous context was a list start, indent forward basic-offset +;; ignore previous list-ends, their indentation is unreliable. +;; then if this is some sort of list-item, do special case fixups: +;; if this is a item start or end and previous was a list end, go back +;; item-continue-indent (the is probably indented for an
  • +;; if this is a list end and previous was a list end, go back +;; item-continue-indent (the is probably indented for an
  • +;; if this is a list end and prev *not* a list end, go back basic-offset +;; else if this line is not a list item, and previous line is a item-start +;; indent continue-indent, because this is part of the item + +;;}}} +;; These are for supporting html-script. With small changes can be useful for +;; javascript + +;; Stan Lanning wrote these defadvice to preserve +;; cursor position. Thank you very much Stan! +(defadvice html-script-narrow-to-asp (around save-excursion activate) + (save-excursion + ad-do-it)) +(defadvice html-script-narrow-to-php (around save-excursion activate) + (save-excursion + ad-do-it)) +(defadvice html-script-narrow-to-vbscript (around save-excursion activate) + (save-excursion + ad-do-it)) +(defadvice html-script-narrow-to-csharp (around save-excursion activate) + (save-excursion + ad-do-it)) +(defadvice html-script-narrow-to-javascript (around save-excursion activate) + (save-excursion + ad-do-it)) +(defadvice html-script-narrow-to-csharp (around save-excursion activate) + (save-excursion + ad-do-it)) +(defadvice html-script-release-region (around save-excursion activate) + (save-excursion + ad-do-it)) + +(defun html-script-narrow-to-asp () + "Narrows to an ASP script and setups visual basic mode. Does nothing if html-helper-mode-uses-visual-basic is nil" + (interactive) + (cond ((or html-helper-mode-uses-visual-basic + html-helper-mode-local-JSP-not-ASP) + (cond ( html-helper-mode-uses-KG-style + (search-backward-regexp "^<%") ) + (t (search-backward "<%" ))) + (let ((beg (point))) + (cond ( html-helper-mode-uses-KG-style + (search-forward-regexp "^%>" )) + ( t (search-forward "%>" nil t))) + (narrow-to-region beg (point))) + (cond (html-helper-mode-local-JSP-not-ASP + (java-mode)) + (t + (visual-basic-mode))) + (goto-char 0)))) + +(defun html-script-narrow-to-aspx () + "Narrows to an ASP script and setups csharp mode. Does nothing if html-helper-mode-uses-csharp is nil" + (interactive) + (cond ((or html-helper-mode-uses-csharp + html-helper-mode-local-JSP-not-ASP) + (cond ( html-helper-mode-uses-KG-style + (search-backward-regexp "^<%") ) + (t (search-backward "<%" ))) + (let ((beg (point))) + (cond ( html-helper-mode-uses-KG-style + (search-forward-regexp "^%>" )) + ( t (search-forward "%>" nil t))) + (narrow-to-region beg (point))) + (cond (html-helper-mode-local-JSP-not-ASP + (java-mode)) + (t + (csharp-mode))) + (goto-char 0)))) + +(defun html-script-narrow-to-php () + "Narrows to an ASP script and setups c-mode" + (interactive) + (search-backward "" nil t) + (narrow-to-region beg (point))) + (c-mode) + (goto-char 0)) + +(defun html-script-narrow-to-vbscript () + "Narrows to a VB Script script and setups visual basic mode. Does nothing if html-helper-mode-uses-visual-basic is nil" + (interactive) + (cond (html-helper-mode-uses-visual-basic + (search-backward-regexp + "<\\(SCRIPT|script\\)[ \t]+\\(\\(LANGUAGE|language\\)=\"VBScript\"\\|TYPE=\"text/vbscript\"\\)[ \t]*>") + (let ((beg (point))) + (search-forward "" nil t) + (narrow-to-region beg (point))) + (visual-basic-mode) + (goto-char 0)))) + +(defun html-script-narrow-to-csharp () + "Narrows to CSharp and sets up csharp mode. Does nothing if html-helper-mode-uses-csharp is nil" + (interactive) + (cond (html-helper-mode-uses-csharp +;; (search-backward-regexp "<\\(SCRIPT|script\\)[ \t]+\\(\\(LANGUAGE|language\\)=\"[Cc]#\"\\|TYPE=\"text/c#\"\\)[ \t]*>") + (search-backward-regexp "" nil t) + (search-backward "\n" nil t) + (narrow-to-region beg (point))) + (csharp-mode) + (goto-char 0) + ) + ) + ) + +(defun html-script-narrow-to-javascript () + "Narrows to a JavaScript script and setups java mode" + (interactive) + (search-backward-regexp "<\\(SCRIPT|script\\)[ \t]+\\(\\(LANGUAGE|language\\)=\"JavaScript\"\\|TYPE=\"text/javascript\"\\)[ \t]*>") + (let ((beg (point))) + (search-forward "" nil t) + (narrow-to-region beg (point))) + (java-mode) + (goto-char 0)) + +(defun html-script-release-region() + "widend the window to the complete buffer and runs html-helper-mode" + (interactive) + (goto-char 0) + (widen) + (html-helper-mode)) + +(defun html-script-release-setup() + (interactive) + (local-set-key [C-f12] 'html-script-release-region)) + +(cond (html-helper-mode-uses-visual-basic + (cond + (visual-basic-mode-hook + (add-hook 'visual-basic-mode-hook 'html-script-release-setup)) + (t (setq visual-basic-mode-hook 'html-script-release-setup))))) +(cond + (java-mode-hook + (add-hook 'java-mode-hook 'html-script-release-setup)) + (t (setq java-mode-hook 'html-script-release-setup))) + +(cond + (c-mode-hook + (add-hook 'c-mode-hook 'html-script-release-setup)) + (t (setq c-mode-hook 'html-script-release-setup))) + +(cond + (csharp-mode-hook + (add-hook 'csharp-mode-hook 'html-script-release-setup)) + (t (setq csharp-mode-hook 'html-script-release-setup))) + + + +;; Still from Stan Lanning here it comes the code for a "smart switch" to +;; the appropriate scripting mode. + +(defvar html-script-toggle-key [f4]) + +(defvar html-script-narrow-alist + `((,(regexp-quote "<%") . html-script-narrow-to-asp) + (,(regexp-quote "" . + html-script-narrow-to-javascript) + (" +;; Maintainer: Ville Skyttä +;; Keywords: languages javascript + +;; This file is part of XEmacs. + +;; XEmacs is free software; you can redistribute it and/or modify it +;; under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; XEmacs is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with XEmacs; see the file COPYING. If not, write to +;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;; Synched up with: not in GNU Emacs. + +;;; Commentary: + +;; javascript-mode was originally derived from java-cust.el +;; (by Jonathan Payne) by Steven Champeon. It has been modified +;; a lot afterwards by Ville Skyttä. + +;; Contributors: +;; Sreng Truong (bug fix for 21.1) +;; Sebastian Delmont (fix for prototype function indentation problems) +;; Stefan Schlee (GNU Emacs compatibility fixes) + +;; TODO: +;; - Multiple font-lock/highlight levels. +;; - Investigate if Semantic Bovinator should be used. +;; - Check syntax-table stuff. + +;;; Code: + +(require 'cc-mode) +(require 'comint) + +(eval-when-compile + (require 'regexp-opt) + (require 'font-lock) + (require 'speedbar) + ) + +;; ------------------------------------------------------------------------ ;; + +(defconst javascript-mode-version "1.8" "Version of `javascript-mode'.") + +;; ------------------------------------------------------------------------ ;; + +(defgroup javascript nil + "Major mode for editing JavaScript code." + :tag "JavaScript" + :group 'languages + :prefix "javascript-") + +(defcustom javascript-mode-hook nil + "Hook for customizing `javascript-mode'." + :group 'javascript + :type 'hook) + +(defgroup javascript-shell nil + "JavaScript shell options." + :group 'javascript + :prefix "javascript-shell-") + +(defcustom javascript-shell-command "jsshell" + "*Command for starting `javascript-shell'. +Set arguments for this command in `javascript-shell-command-args'." + :type 'string + :group 'javascript-shell) + +(defcustom javascript-shell-command-args '() + "*Command line arguments for `javascript-shell-command'." + :type '(repeat (string :tag "Argument")) + :group 'javascript-shell) + +(defcustom javascript-shell-prompt-pattern "^js> *" + "*JavaScript shell prompt pattern." + :type 'regexp + :group 'javascript-shell) + +(defcustom javascript-shell-mode-hook nil + "Hook for customizing `javascript-shell-mode'." + :type 'hook + :group 'javascript-shell) + +;; ------------------------------------------------------------------------ ;; + +(defvar javascript-mode-abbrev-table nil + "Abbrev table in use in `javascript-mode' buffers.") +(define-abbrev-table 'javascript-mode-abbrev-table ()) + +;; ------------------------------------------------------------------------ ;; + +(defvar javascript-mode-map nil + "Keymap used in `javascript-mode' buffers.") +(if javascript-mode-map + () + (setq javascript-mode-map (copy-keymap c++-mode-map)) + (define-key javascript-mode-map [(meta backspace)] 'backward-kill-word) + (define-key javascript-mode-map [(meta backward)] 'backward-kill-word) + (define-key javascript-mode-map [(meta delete)] 'backward-kill-word) + (define-key javascript-mode-map [(meta control h)] 'backward-kill-word) + ) + +;; ------------------------------------------------------------------------ ;; + +;; Reserved words in JavaScript. +(defconst javascript-reserved-words + (eval-when-compile + (regexp-opt + '( + "abstract" + "boolean" + "break" + "byte" + "case" + "catch" + "char" + "class" + "const" + "continue" + "debugger" + "default" + "delete" + "do" + "double" + "else" + "enum" + "export" + "extends" + "false" + "final" + "finally" + "float" + "for" + "function" + "goto" + "if" + "implements" + "import" + "in" + "instanceof" + "int" + "interface" + "long" + "native" + "new" + "null" + "package" + "private" + "protected" + "public" + "return" + "short" + "static" + "super" + "switch" + "synchronized" + "this" + "throw" + "throws" + "transient" + "true" + "try" + "typeof" + "var" + "void" + "volatile" + "while" + "with" + ) t)) + "Expression for matching reserved words in `javascript-mode' buffers. + +From Core JavaScript Reference 1.5, Appendix A (Reserved Words): +") + + +;; JavaScript identifiers +;; This one is intentionally not too strict... +(defconst javascript-identifier + "[a-zA-Z_\\$][a-zA-Z0-9_\\$]*" + "Expression for matching identifiers in `javascript-mode' buffers. + +From Core JavaScript Guide 1.5, Chapter 2 (Values, Variables and Literals): +") + +;; ------------------------------------------------------------------------ ;; + +;; Font lock keywords + +(defconst javascript-function-re + (concat "\\(^\\|[ \t;{]\\)function[ \t]+\\(" + javascript-identifier + "\\)")) + +(defconst javascript-variable-re + (concat "\\(^\\|[ \t;{(]\\)\\(const\\|var\\)[ \t]+\\(" + javascript-identifier + "\\)")) + +(defconst javascript-font-lock-keywords + (list + + ;; Reserved words. + (cons (concat + "\\(^\\|[ \t;{(]\\)\\(" + javascript-reserved-words + "\\)[ \t\n(){};,]") + '(2 'font-lock-keyword-face)) + + ;; Function declarations. + (cons javascript-function-re '(2 'font-lock-function-name-face)) + ;; This would catch both declarations and calls. + ;(cons (concat + ; "\\(^\\|[ \t.;{(]\\)\\(" + ; javascript-identifier + ; "\\)[ \t]*(") + ; '(2 'font-lock-function-name-face)) + + ;; Variables and constants. + (cons javascript-variable-re '(3 'font-lock-variable-name-face)) + ;; This would catch more of them and properties as well. + ;(cons (concat + ; "\\(^\\|[ \t(\\[\\.{;]\\)\\(" + ; javascript-identifier + ; "\\)[ \t]*[^(]") + ; '(2 'font-lock-variable-name-face)) + + ) + "Highlighting rules for `javascript-mode' buffers.") + +;; ------------------------------------------------------------------------ ;; + +(defvar javascript-imenu-generic-expression + `((nil ,javascript-function-re 2) + ;; ("Variables" ,javascript-variable-re 3) + ) + "Imenu generic expression for JavaScript mode. +See `imenu-generic-expression'.") + +;; ------------------------------------------------------------------------ ;; + +;;;###autoload +(defun javascript-mode () + "Major mode for editing JavaScript code. + +See the documentation for `c++-mode': JavaScript mode is an extension of it. +Use the hook `javascript-mode-hook' to execute custom code when entering +JavaScript mode. + +\\{javascript-mode-map}" + (interactive) + + (let ((current-c++-mode-hook (and (boundp 'c++-mode-hook) c++-mode-hook))) + + ;; Temporarily disable the c++-mode hook; don't wanna run + ;; it when loading up c++-mode. + (setq c++-mode-hook nil) + (c++-mode) + + ;; Do our stuff. + (setq major-mode 'javascript-mode mode-name "JavaScript") + (use-local-map javascript-mode-map) + (setq local-abbrev-table javascript-mode-abbrev-table) + (c-set-offset 'inher-cont '+) + + ;; Change menu name. Kudos to Geert Ribbers. + (easy-menu-remove '("C++")) + (easy-menu-add (c-mode-menu "JavaScript") javascript-mode-map) + + ;; GNU Emacs reportedly needs this for font locking to work properly. + (unless (featurep 'xemacs) + (set (make-local-variable 'font-lock-defaults) + '(javascript-font-lock-keywords nil nil))) + + ;; cc-mode does not handle JavaScript prototype function declarations well. + ;; Thanks to Sebastian Delmont. + (set (make-local-variable 'c-lambda-key) "function") + (c-set-offset 'inlambda 0) + + ;; imenu support. + (set (make-local-variable 'imenu-generic-expression) + javascript-imenu-generic-expression) + + ;; Restore the original c++-mode-hook. + (setq c++-mode-hook current-c++-mode-hook) + + (run-hooks 'javascript-mode-hook))) + +;; ------------------------------------------------------------------------ ;; + +;;;###autoload +(defun javascript-shell () + "Run a JavaScript shell as an inferior process. + +Use the `javascript-shell-command' variable to set the command and +`javascript-shell-command-args' for its arguments to specify the +command line that invokes your preferred JavaScript shell. + +Free JavaScript shell implementations are available for example from +. + +Usage examples: command arguments + Mozilla SpiderMonkey jsshell + Mozilla Rhino java -jar /path/to/js.jar" + + (interactive) + + (unless (comint-check-proc "*JavaScript*") + (set-buffer + (apply 'make-comint "JavaScript" + javascript-shell-command nil javascript-shell-command-args)) + (javascript-shell-mode) + ) + + (pop-to-buffer "*JavaScript*") + ) + + +(defun javascript-shell-mode () + "Major mode for interacting with a JavaScript shell." + (comint-mode) + (setq comint-prompt-regexp javascript-shell-prompt-pattern) + (setq mode-name 'javascript-shell-mode) + (setq mode-name "JavaScript Shell") + (setq mode-line-process '(":%s")) + (run-hooks 'javascript-shell-mode-hook) + ) + +;; ------------------------------------------------------------------------ ;; + +;;;###autoload(add-to-list 'auto-mode-alist '("\\.js$" . javascript-mode)) + +;; Speedbar handling +(if (fboundp 'speedbar-add-supported-extension) + (speedbar-add-supported-extension ".js")) + +;; ------------------------------------------------------------------------ ;; + +(provide 'javascript-mode) + +;;; javascript-mode.el ends here + diff --git a/site-lisp/javascript-mode.elc b/site-lisp/javascript-mode.elc new file mode 100644 index 0000000000000000000000000000000000000000..de417fa01d1c198e41c4d457979b051f7aae2458 GIT binary patch literal 6700 zcmbVQ>vP-25%;&+oN1>`JDusLtl?xx+6GAgd{}bEj^#K_U8kAYN%}CA`UoCLNFadV zL79&7zxTI$011+o<60vExVzoGy}fK)<#*z=ADF1fwlP-x83cu6x*p>Eet z-lz*ZNn^V==q}gO*w38qQxN_Fgu7XgYdZ|GqOlLG* zM`{`P#O&p15Y4l@SWUB>)N~4AY}jy)I_^=Y(F$hNQqh!Jlembc2{koyX_s8K8#k!+ z86Z+Uqn#CMIX1OI9nHb}&Pu!8riYINGfwx3C$YacKCY;f-W_8%{%aZ5?NDb~vP+yS zVcfzd4FT0@ie0Q%hhlHih02IUDrztTn7IL=Kp2K9*C|MeB%w1O_Sa}MT6}r7kLxCD z?Dcy1IXB0y!yo)}G3bpfdYS5w6k2LBJR2z1fkh!ywEV- zbY3iVl*7~kp0mwEbp#(4eSig3ltmkOnJCWt$kK3F(QR61nao&~RBgvO8bYo{h{i_W zB4r~szU{$id(1G1^xiS9Wc$N7mcvrBt_QZ$cSjqJTd7X8$}9I$YVxB}wD1G(Jd8J> z+Xq^JaIj2rN>mO{60wE8zn~4SUE)&H`tdA#K(}k+9(wME`BcyK>*Spr_D8>NT;`71 z%>PdzGs>Z%IisWghD9;M${B2}p{5TGJ(^5Xy`o$U8LEq*#WAU_3c?&sirEa#uylH` zeX3CuW|WY!4JkHKWBbn0V8Ct!=7(^{_*TRI78mkV}lmZG8B$tmK(t?h-;WD+`rk7^*D8D+VseWK0oJq%hb_U@8k3 zV|h}{=bEu*st6gBugOr01)xA|#rUC_Gf1Iq8x>2yzZR$@PGuj+6nkS6-e)FD5E8I1 zgGhxk4%ddGF#C(ieCXA$Vh8vl(<82@8f`4HSbFGD3`Eq~f`T^cWIy z32+nqnd-bq`KEAmfG*-#zW@u*q$S|c7_KOt0D7Rq(Q?3tpGWQxgHD^65O~i&rs1ya!Q^gZAj6B`69$mQqr_Q8767xuZ6*b z%47!DkCXf79A%6{uSY-;93K5|@fe)2@P;Sj2(Qt}lfxjk=Spj$sZRgC5~~DZqyzzs zqgMOpU+&*M#l^eSJmA}AN7LS0+w6*pTUQWX9eZ(QMhKq!Ay1Tp0r z4imi;l*>WhX?%}ll8H$oy05L0yf!J1fv5cwjVWhW|hfXwp2#feUe5cn!xJ z&!lbe+dqGd5pqFifZuRzm5|8%TqeW`pX=b~Vj0baSq0&GnC$ab{XSAl7wGQrCLW__ zB^G8pknlXGoZ)Re(DA$t5r*mC{2d9z4e;vm%stg^9TX{Sr)SPE!)T$}Y zc6s9v`DpmHu~n#+lc{1~NmgZR7T7lP)T1kHI4vT%i)>#w=7x+wb_82v>ME+R?aH+K zN4++4c`EhM$f4&&M5=CtFVWE6o zY{*qF0%=0yN>tP25T6l1-rH6Q6H2rn%+^e-Q4y0)M7}^HAc$7+IfC0dE|^)a8&Z@W zPq#fU;Sv0QnZo7n&*MIlP_k9=TD&z{94i%sQr$`$?X_YU;zshO*tod3=q%$mD5X>< zPUl=$JP;Wn6@_yWjO>`ZoBUU?jnB=|8uYcnrxyv5i1h0?Vy&UFW3yd;j-o0SGW=lS zmjn9@;h~G(!=jtV;Gl!?Ro=|p?be;aS@b;dF&}aHDkUr4LyjDy8=wAEI;*XJtKhi< zdX)myHFrldOj`$1K%><57aG|F>lInGZVVDOl_cTX*rb8o^$Tof2U|-lN#exLW83r_ zPH9-`{Gg9;w$b^)K}Z8P$XZd$plFr;{h>LOy^F)}V9qDIZ>8FoaB%$(5Y_+zp*Q5m zh@%3Wy~FKf=^!5*Vy}%<3aXqfyGC0NEMIH^B19M`>laH_xH%v$v$bX~z2KH8vLx&H z(+uA7t&V4VJaIqhZkIA0y56V_AF`Kn;C#|9?|I{h6$*h(I_A>WKtStBKx5^ZmGJ;( nt)~-}+VIhKRwP`M>M4?-Dj~2sXPL$RX9e@9Upya3+U@@Xm-@6C literal 0 HcmV?d00001 diff --git a/site-lisp/js2 (JOHNDOTY-1).el b/site-lisp/js2 (JOHNDOTY-1).el new file mode 100644 index 0000000..fc48487 --- /dev/null +++ b/site-lisp/js2 (JOHNDOTY-1).el @@ -0,0 +1,11294 @@ +;;; js2.el -- an improved JavaScript editing mode +;;; +;;; This file was auto-generated on Thu Apr 24 03:14:31 2008 from files: +;;; js2-vars.el +;;; js2-util.el +;;; js2-scan.el +;;; js2-messages.el +;;; js2-ast.el +;;; js2-highlight.el +;;; js2-browse.el +;;; js2-parse.el +;;; js2-indent.el +;;; js2-mode.el + +;;; js2-mode.el --- an improved JavaScript editing mode + +;; Author: Steve Yegge (steve.yegge@gmail.com) +;; Version: 20080424 +;; Keywords: javascript languages + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2 of +;; the License, or (at your option) any later version. + +;; This program is distributed in the hope that it will be +;; useful, but WITHOUT ANY WARRANTY; without even the implied +;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +;; PURPOSE. See the GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public +;; License along with this program; if not, write to the Free +;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, +;; MA 02111-1307 USA + +;;; Commentary: + +;; This JavaScript editing mode supports: +;; +;; - the full JavaScript language through version 1.7 +;; - accurate syntax highlighting using a recursive-descent parser +;; - syntax-error and strict-mode warning reporting +;; - "bouncing" line indentation to choose among alternate indentation points +;; - smart line-wrapping within comments (Emacs 22+) and strings +;; - code folding: +;; - show some or all function bodies as {...} +;; - show some or all block comments as /*...*/ +;; - context-sensitive menu bar and popup menus +;; - code browsing using the `imenu' package +;; - typing helpers (e.g. inserting matching braces/parens) +;; - many customization options +;; +;; It is only compatible with GNU Emacs versions 21 and higher (not XEmacs). +;; +;; Installation: +;; +;; - put `js2.el' somewhere in your emacs load path +;; - M-x byte-compile-file RET RET +;; Note: it will refuse to run unless byte-compiled +;; - add these lines to your .emacs file: +;; (autoload 'js2-mode "js2" nil t) +;; (add-to-list 'auto-mode-alist '("\\.js$" . js2-mode)) +;; +;; To customize how it works: +;; M-x customize-group RET js2-mode RET +;; +;; The variable `js2-mode-version' is a date stamp. When you upgrade +;; to a newer version, you must byte-compile the file again. +;; +;; Notes: +;; +;; This mode is different in many ways from standard Emacs language editing +;; modes, inasmuch as it attempts to be more like an IDE. If this drives +;; you crazy, it IS possible to customize it to be more like other Emacs +;; editing modes. Please customize the group `js2-mode' to see all of the +;; configuration options. +;; +;; Some of the functionality does not work in Emacs 21 -- upgrading to +;; Emacs 22 or higher will get you better results. If you byte-compiled +;; js2.el with Emacs 21, you should re-compile it for Emacs 22. +;; +;; Unlike cc-engine based language modes, js2-mode's line-indentation is not +;; customizable. It is a surprising amount of work to support customizable +;; indentation. The current compromise is that the tab key lets you cycle among +;; various likely indentation points, similar to the behavior of python-mode. +;; +;; This mode does not yet work with mmm-mode ("multiple major modes" mode), +;; although it could possibly be made to do so with some effort. +;; +;; This code is part of a larger project, in progress, to enable writing +;; Emacs customizations in JavaScript. +;; +;; Please email bug reports and suggestions to the author, or submit them +;; at http://code.google.com/p/js2-mode/issues + +;; TODO: +;; - set a text prop on autoinserted delimiters and don't biff user-entered ones +;; - clean up xml member-expr parsing +;; - add in remaining Ecma strict-mode warnings +;; - get more use out of the symbol table: +;; - jump to declaration (put hyperlinks on all non-decl var usages?) +;; - rename variable/function +;; - warn on unused var +;; - add some dabbrev-expansions for built-in keywords like finally, function +;; - add at least some completion support, e.g. for built-ins +;; - code formatting + +;;; Code: +;;; js2-vars.el -- byte-compiler support for js2-mode + +;; Author: Steve Yegge (steve.yegge@gmail.com) +;; Keywords: javascript languages + +;;; Code: + +(eval-when-compile + (require 'cl)) + +(eval-and-compile + (require 'cc-mode) ; (only) for `c-populate-syntax-table' + (require 'cc-langs) ; it's here in Emacs 21... + (require 'cc-engine)) ; for `c-paragraph-start' et. al. + +(defvar js2-emacs22 (>= emacs-major-version 22)) + +(defcustom js2-highlight-level 2 + "Amount of syntax highlighting to perform. +nil, zero or negative means none. +1 adds basic syntax highlighting. +2 adds highlighting of some Ecma built-in properties. +3 adds highlighting of many Ecma built-in functions." + :type 'integer + :group 'js2-mode) + +(defvar js2-mode-dev-mode-p nil + "Non-nil if running in development mode. Normally nil.") + +(defgroup js2-mode nil + "An improved JavaScript mode." + :group 'languages) + +(defcustom js2-basic-offset (if (and (boundp 'c-basic-offset) + (numberp c-basic-offset)) + c-basic-offset + 2) + "Number of spaces to indent nested statements. +Similar to `c-basic-offset'." + :group 'js2-mode + :type 'integer) +(make-variable-buffer-local 'js2-basic-offset) + +(defcustom js2-cleanup-whitespace t + "Non-nil to invoke `delete-trailing-whitespace' before saves." + :type 'boolean + :group 'js2-mode) + +(defcustom js2-move-point-on-right-click t + "Non-nil to move insertion point when you right-click. +This makes right-click context menu behavior a bit more intuitive, +since menu operations generally apply to the point. The exception +is if there is a region selection, in which case the point does -not- +move, so cut/copy/paste etc. can work properly. + +Note that IntelliJ moves the point, and Eclipse leaves it alone, +so this behavior is customizable." + :group 'js2-mode + :type 'boolean) + +(defcustom js2-mirror-mode t + "Non-nil to insert closing brackets, parens, etc. automatically." + :group 'js2-mode + :type 'boolean) + +(defcustom js2-auto-indent-flag t + "Automatic indentation with punctuation characters. If non-nil, the +current line is indented when certain punctuations are inserted." + :group 'js2-mode + :type 'boolean) + +(defcustom js2-bounce-indent-flag t + "Non-nil to have indent-line function choose among alternatives. +If nil, the indent-line function will indent to a predetermined column +based on heuristic guessing. If non-nil, then if the current line is +already indented to that predetermined column, indenting will choose +another likely column and indent to that spot. Repeated invocation of +the indent-line function will cycle among the computed alternatives. +See the function `js2-bounce-indent' for details." + :type 'boolean + :group 'js2-mode) + +(defcustom js2-indent-on-enter-key nil + "Non-nil to have Enter/Return key indent the line. +This is unusual for Emacs modes but common in IDEs like Eclipse." + :type 'boolean + :group 'js2-mode) + +(defcustom js2-rebind-eol-bol-keys t + "Non-nil to rebind beginning-of-line and end-of-line keys. +If non-nil, bounce between bol/eol and first/last non-whitespace char." + :group 'js2-mode + :type 'boolean) + +(defcustom js2-electric-keys '("{" "}" "(" ")" "[" "]" ":" ";" "," "*") + "Keys that auto-indent when `js2-auto-indent-flag' is non-nil. +Each value in the list is passed to `define-key'." + :type 'list + :group 'js2-mode) + +(defcustom js2-idle-timer-delay 0.2 + "Delay in secs before re-parsing after user makes changes. +Multiplied by `js2-dynamic-idle-timer-adjust', which see." + :type 'number + :group 'js2-mode) +(make-variable-buffer-local 'js2-idle-timer-delay) + +(defcustom js2-dynamic-idle-timer-adjust 0 + "Positive to adjust `js2-idle-timer-delay' based on file size. +The idea is that for short files, parsing is faster so we can be +more responsive to user edits without interfering with editing. +The buffer length in characters (typically bytes) is divided by +this value and used to multiply `js2-idle-timer-delay' for the +buffer. For example, a 21k file and 10k adjust yields 21k/10k +== 2, so js2-idle-timer-delay is multiplied by 2. +If `js2-dynamic-idle-timer-adjust' is 0 or negative, +`js2-idle-timer-delay' is not dependent on the file size." + :type 'number + :group 'js2-mode) + +(defcustom js2-mode-escape-quotes t + "Non-nil to disable automatic quote-escaping inside strings." + :type 'boolean + :group 'js2-mode) + +(defcustom js2-mode-squeeze-spaces t + "Non-nil to normalize whitespace when filling in comments. +Multiple runs of spaces are converted to a single space." + :type 'boolean + :group 'js2-mode) + +(defcustom js2-mode-show-parse-errors t + "True to highlight parse errors." + :type 'boolean + :group 'js2-mode) + +(defcustom js2-mode-show-strict-warnings t + "Non-nil to emit Ecma strict-mode warnings. +Some of the warnings can be individually disabled by other flags, +even if this flag is non-nil." + :type 'boolean + :group 'js2-mode) + +(defcustom js2-strict-trailing-comma-warning t + "Non-nil to warn about trailing commas in array literals. +Ecma-262 forbids them, but many browsers permit them. IE is the +big exception, and can produce bugs if you have trailing commas." + :type 'boolean + :group 'js2-mode) + +(defcustom js2-strict-missing-semi-warning t + "Non-nil to warn about semicolon auto-insertion after statement. +Technically this is legal per Ecma-262, but some style guides disallow +depending on it." + :type 'boolean + :group 'js2-mode) + +(defcustom js2-missing-semi-one-line-override nil + "Non-nil to permit missing semicolons in one-line functions. +In one-liner functions such as `function identity(x) {return x}' +people often omit the semicolon for a cleaner look. If you are +such a person, you can suppress the missing-semicolon warning +by setting this variable to t." + :type 'boolean + :group 'js2-mode) + +(defcustom js2-strict-inconsistent-return-warning t + "Non-nil to warn about mixing returns with value-returns. +It's perfectly legal to have a `return' and a `return foo' in the +same function, but it's often an indicator of a bug, and it also +interferes with type inference (in systems that support it.)" + :type 'boolean + :group 'js2-mode) + +(defcustom js2-strict-cond-assign-warning t + "Non-nil to warn about expressions like if (a = b). +This often should have been '==' instead of '='. If the warning +is enabled, you can suppress it on a per-expression basis by +parenthesizing the expression, e.g. if ((a = b)) ..." + :type 'boolean + :group 'js2-mode) + +(defcustom js2-strict-cond-assign-warning t + "Non-nil to warn about expressions like if (a = b). +This often should have been '==' instead of '='. If the warning +is enabled, you can suppress it on a per-expression basis by +parenthesizing the expression, e.g. if ((a = b)) ..." + :type 'boolean + :group 'js2-mode) + +(defcustom js2-strict-var-redeclaration-warning t + "Non-nil to warn about redeclaring variables in a script or function." + :type 'boolean + :group 'js2-mode) + +(defcustom js2-strict-var-hides-function-arg-warning t + "Non-nil to warn about a var decl hiding a function argument." + :type 'boolean + :group 'js2-mode) + +(defcustom js2-skip-preprocessor-directives nil + "Non-nil to treat lines beginning with # as comments. +Useful for viewing Mozilla JavaScript source code." + :type 'boolean + :group 'js2-mode) + +(defcustom js2-basic-offset c-basic-offset + "Functions like `c-basic-offset' in js2-mode buffers." + :type 'integer + :group 'js2-mode) +(make-variable-buffer-local 'js2-basic-offset) + +(defcustom js2-language-version 170 + "Configures what JavaScript language version to recognize. +Currently only 150, 160 and 170 are supported, corresponding +to JavaScript 1.5, 1.6 and 1.7, respectively. In a nutshell, +1.6 adds E4X support, and 1.7 adds let, yield, and Array +comprehensions." + :type 'integer + :group 'js2-mode) + +(defcustom js2-allow-keywords-as-property-names nil + "If non-nil, you can use JavaScript keywords as object property names. +Examples: + + var foo = {int: 5, while: 6, continue: 7}; + foo.return = 8; + +Ecma-262 forbids this syntax, but many browsers support it." + :type 'boolean + :group 'js2-mode) + +(defcustom js2-instanceof-has-side-effects nil + "If non-nil, treats the instanceof operator as having side effects. +This is useful for xulrunner apps." + :type 'boolean + :group 'js2-mode) + +(defcustom js2-allow-rhino-new-expr-initializer nil + "Non-nil to support a Rhino's experimental syntactic construct. + +Rhino supports the ability to follow a `new' expression with an object +literal, which is used to set additional properties on the new object +after calling its constructor. Syntax: + + new [ ( arglist ) ] [initializer] + +Hence, this expression: + + new Object {a: 1, b: 2} + +results in an Object with properties a=1 and b=2. This syntax is +apparently not configurable in Rhino - it's currently always enabled, +as of Rhino version 1.7R2." + :type 'boolean + :group 'js2-mode) + +(defcustom js2-allow-member-expr-as-function-name nil + "Non-nil to support experimental Rhino syntax for function names. + +NOTE: this is currently a placeholder, and `js2-mode' does not yet +support this syntax. + +Rhino supports an experimental syntax configured via the Rhino Context +setting `allowMemberExprAsFunctionName'. The experimental syntax is: + + function ( [ arg-list ] ) { } + +Where member-expr is a non-parenthesized 'member expression', which +is anything at the grammar level of a new-expression or lower, meaning +any expression that does not involve infix or unary operators. + +When is not a simple identifier, then it is syntactic +sugar for assigning the anonymous function to the . Hence, +this code: + + function a.b().c[2] (x, y) { ... } + +is rewritten as: + + a.b().c[2] = function(x, y) {...} + +which doesn't seem particularly useful, but Rhino permits it." + :type 'boolean + :group 'js2-mode) + +(defvar js2-mode-version 20080424 + "Release number for `js2-mode'.") + +;; scanner variables + +;; We record the start and end position of each token. +(defvar js2-token-beg 1) +(make-variable-buffer-local 'js2-token-beg) +(defvar js2-token-end -1) +(make-variable-buffer-local 'js2-token-end) + +(defvar js2-EOF_CHAR -1 + "Represents end of stream. Distinct from js2-EOF token type.") + +;; I originally used symbols to represent tokens, but Rhino uses +;; ints and then sets various flag bits in them, so ints it is. +;; The upshot is that we need a `js2-' prefix in front of each name. +(defvar js2-ERROR -1) +(defvar js2-EOF 0) +(defvar js2-EOL 1) +(defvar js2-ENTERWITH 2) ; begin interpreter bytecodes +(defvar js2-LEAVEWITH 3) +(defvar js2-RETURN 4) +(defvar js2-GOTO 5) +(defvar js2-IFEQ 6) +(defvar js2-IFNE 7) +(defvar js2-SETNAME 8) +(defvar js2-BITOR 9) +(defvar js2-BITXOR 10) +(defvar js2-BITAND 11) +(defvar js2-EQ 12) +(defvar js2-NE 13) +(defvar js2-LT 14) +(defvar js2-LE 15) +(defvar js2-GT 16) +(defvar js2-GE 17) +(defvar js2-LSH 18) +(defvar js2-RSH 19) +(defvar js2-URSH 20) +(defvar js2-ADD 21) ; infix plus +(defvar js2-SUB 22) ; infix minus +(defvar js2-MUL 23) +(defvar js2-DIV 24) +(defvar js2-MOD 25) +(defvar js2-NOT 26) +(defvar js2-BITNOT 27) +(defvar js2-POS 28) ; unary plus +(defvar js2-NEG 29) ; unary minus +(defvar js2-NEW 30) +(defvar js2-DELPROP 31) +(defvar js2-TYPEOF 32) +(defvar js2-GETPROP 33) +(defvar js2-GETPROPNOWARN 34) +(defvar js2-SETPROP 35) +(defvar js2-GETELEM 36) +(defvar js2-SETELEM 37) +(defvar js2-CALL 38) +(defvar js2-NAME 39) ; an identifier +(defvar js2-NUMBER 40) +(defvar js2-STRING 41) +(defvar js2-NULL 42) +(defvar js2-THIS 43) +(defvar js2-FALSE 44) +(defvar js2-TRUE 45) +(defvar js2-SHEQ 46) ; shallow equality (===) +(defvar js2-SHNE 47) ; shallow inequality (!==) +(defvar js2-REGEXP 48) +(defvar js2-BINDNAME 49) +(defvar js2-THROW 50) +(defvar js2-RETHROW 51) ; rethrow caught exception: catch (e if ) uses it +(defvar js2-IN 52) +(defvar js2-INSTANCEOF 53) +(defvar js2-LOCAL_LOAD 54) +(defvar js2-GETVAR 55) +(defvar js2-SETVAR 56) +(defvar js2-CATCH_SCOPE 57) +(defvar js2-ENUM_INIT_KEYS 58) +(defvar js2-ENUM_INIT_VALUES 59) +(defvar js2-ENUM_INIT_ARRAY 60) +(defvar js2-ENUM_NEXT 61) +(defvar js2-ENUM_ID 62) +(defvar js2-THISFN 63) +(defvar js2-RETURN_RESULT 64) ; to return previously stored return result +(defvar js2-ARRAYLIT 65) ; array literal +(defvar js2-OBJECTLIT 66) ; object literal +(defvar js2-GET_REF 67) ; *reference +(defvar js2-SET_REF 68) ; *reference = something +(defvar js2-DEL_REF 69) ; delete reference +(defvar js2-REF_CALL 70) ; f(args) = something or f(args)++ +(defvar js2-REF_SPECIAL 71) ; reference for special properties like __proto +(defvar js2-YIELD 72) ; JS 1.7 yield pseudo keyword + +;; XML support +(defvar js2-DEFAULTNAMESPACE 73) +(defvar js2-ESCXMLATTR 74) +(defvar js2-ESCXMLTEXT 75) +(defvar js2-REF_MEMBER 76) ; Reference for x.@y, x..y etc. +(defvar js2-REF_NS_MEMBER 77) ; Reference for x.ns::y, x..ns::y etc. +(defvar js2-REF_NAME 78) ; Reference for @y, @[y] etc. +(defvar js2-REF_NS_NAME 79) ; Reference for ns::y, @ns::y@[y] etc. + +(defvar js2-first-bytecode js2-ENTERWITH) +(defvar js2-last-bytecode js2-REF_NS_NAME) + +(defvar js2-TRY 80) +(defvar js2-SEMI 81) ; semicolon +(defvar js2-LB 82) ; left and right brackets +(defvar js2-RB 83) +(defvar js2-LC 84) ; left and right curly-braces +(defvar js2-RC 85) +(defvar js2-LP 86) ; left and right parens +(defvar js2-RP 87) +(defvar js2-COMMA 88) ; comma operator + +(defvar js2-ASSIGN 89) ; simple assignment (=) +(defvar js2-ASSIGN_BITOR 90) ; |= +(defvar js2-ASSIGN_BITXOR 91) ; ^= +(defvar js2-ASSIGN_BITAND 92) ; &= +(defvar js2-ASSIGN_LSH 93) ; <<= +(defvar js2-ASSIGN_RSH 94) ; >>= +(defvar js2-ASSIGN_URSH 95) ; >>>= +(defvar js2-ASSIGN_ADD 96) ; += +(defvar js2-ASSIGN_SUB 97) ; -= +(defvar js2-ASSIGN_MUL 98) ; *= +(defvar js2-ASSIGN_DIV 99) ; /= +(defvar js2-ASSIGN_MOD 100) ; %= + +(defvar js2-first-assign js2-ASSIGN) +(defvar js2-last-assign js2-ASSIGN_MOD) + +(defvar js2-HOOK 101) ; conditional (?:) +(defvar js2-COLON 102) +(defvar js2-OR 103) ; logical or (||) +(defvar js2-AND 104) ; logical and (&&) +(defvar js2-INC 105) ; increment/decrement (++ --) +(defvar js2-DEC 106) +(defvar js2-DOT 107) ; member operator (.) +(defvar js2-FUNCTION 108) ; function keyword +(defvar js2-EXPORT 109) ; export keyword +(defvar js2-IMPORT 110) ; import keyword +(defvar js2-IF 111) ; if keyword +(defvar js2-ELSE 112) ; else keyword +(defvar js2-SWITCH 113) ; switch keyword +(defvar js2-CASE 114) ; case keyword +(defvar js2-DEFAULT 115) ; default keyword +(defvar js2-WHILE 116) ; while keyword +(defvar js2-DO 117) ; do keyword +(defvar js2-FOR 118) ; for keyword +(defvar js2-BREAK 119) ; break keyword +(defvar js2-CONTINUE 120) ; continue keyword +(defvar js2-VAR 121) ; var keyword +(defvar js2-WITH 122) ; with keyword +(defvar js2-CATCH 123) ; catch keyword +(defvar js2-FINALLY 124) ; finally keyword +(defvar js2-VOID 125) ; void keyword +(defvar js2-RESERVED 126) ; reserved keywords + +(defvar js2-EMPTY 127) + +;; Types used for the parse tree - never returned by scanner. + +(defvar js2-BLOCK 128) ; statement block +(defvar js2-LABEL 129) ; label +(defvar js2-TARGET 130) +(defvar js2-LOOP 131) +(defvar js2-EXPR_VOID 132) ; expression statement in functions +(defvar js2-EXPR_RESULT 133) ; expression statement in scripts +(defvar js2-JSR 134) +(defvar js2-SCRIPT 135) ; top-level node for entire script +(defvar js2-TYPEOFNAME 136) ; for typeof(simple-name) +(defvar js2-USE_STACK 137) +(defvar js2-SETPROP_OP 138) ; x.y op= something +(defvar js2-SETELEM_OP 139) ; x[y] op= something +(defvar js2-LOCAL_BLOCK 140) +(defvar js2-SET_REF_OP 141) ; *reference op= something + +;; For XML support: +(defvar js2-DOTDOT 142) ; member operator (..) +(defvar js2-COLONCOLON 143) ; namespace::name +(defvar js2-XML 144) ; XML type +(defvar js2-DOTQUERY 145) ; .() -- e.g., x.emps.emp.(name == "terry") +(defvar js2-XMLATTR 146) ; @ +(defvar js2-XMLEND 147) + +;; Optimizer-only tokens +(defvar js2-TO_OBJECT 148) +(defvar js2-TO_DOUBLE 149) + +(defvar js2-GET 150) ; JS 1.5 get pseudo keyword +(defvar js2-SET 151) ; JS 1.5 set pseudo keyword +(defvar js2-LET 152) ; JS 1.7 let pseudo keyword +(defvar js2-CONST 153) +(defvar js2-SETCONST 154) +(defvar js2-SETCONSTVAR 155) +(defvar js2-ARRAYCOMP 156) +(defvar js2-LETEXPR 157) +(defvar js2-WITHEXPR 158) +(defvar js2-DEBUGGER 159) + +(defvar js2-COMMENT 160) ; not yet in Rhino + +(defvar js2-num-tokens (1+ js2-COMMENT)) + +(defconst js2-debug-print-trees nil) + +;; Rhino accepts any string or stream as input. +;; Emacs character processing works best in buffers, so we'll +;; assume the input is a buffer. JavaScript strings can be +;; copied into temp buffers before scanning them. + +(defmacro deflocal (name value comment) + `(progn + (defvar ,name ,value ,comment) + (make-variable-buffer-local ',name))) + +;; Buffer-local variables yield much cleaner code than using `defstruct'. +;; They're the Emacs equivalent of instance variables, more or less. + +(deflocal js2-ts-dirty-line nil + "Token stream buffer-local variable. +Indicates stuff other than whitespace since start of line.") + +(deflocal js2-ts-regexp-flags nil + "Token stream buffer-local variable.") + +(deflocal js2-ts-string "" + "Token stream buffer-local variable. +Last string scanned.") + +(deflocal js2-ts-number nil + "Token stream buffer-local variable. +Last literal number scanned.") + +(deflocal js2-ts-hit-eof nil + "Token stream buffer-local variable.") + +(deflocal js2-ts-line-start 0 + "Token stream buffer-local variable.") + +(deflocal js2-ts-lineno 1 + "Token stream buffer-local variable.") + +(deflocal js2-ts-line-end-char -1 + "Token stream buffer-local variable.") + +(deflocal js2-ts-cursor 1 ; emacs buffers are 1-indexed + "Token stream buffer-local variable. +Current scan position.") + +(deflocal js2-ts-is-xml-attribute nil + "Token stream buffer-local variable.") + +(deflocal js2-ts-xml-is-tag-content nil + "Token stream buffer-local variable.") + +(deflocal js2-ts-xml-open-tags-count 0 + "Token stream buffer-local variable.") + +(deflocal js2-ts-string-buffer nil + "Token stream buffer-local variable. +List of chars built up while scanning various tokens.") + +(deflocal js2-ts-comment-type nil + "Token stream buffer-local variable.") + +;;; Parser variables + +(defvar js2-parsed-errors nil + "List of errors produced during scanning/parsing.") +(make-variable-buffer-local 'js2-parsed-errors) + +(defvar js2-parsed-warnings nil + "List of warnings produced during scanning/parsing.") +(make-variable-buffer-local 'js2-parsed-warnings) + +(defvar js2-recover-from-parse-errors t + "Non-nil to continue parsing after a syntax error. + +In recovery mode, the AST will be built in full, and any error +nodes will be flagged with appropriate error information. If +this flag is nil, a syntax error will result in an error being +signaled. + +The variable is automatically buffer-local, because different +modes that use the parser will need different settings.") +(make-variable-buffer-local 'js2-recover-from-parse-errors) + +(defvar js2-parse-hook nil + "List of callbacks for receiving parsing progress.") +(make-variable-buffer-local 'js2-parse-hook) + +(defvar js2-parse-finished-hook nil + "List of callbacks to notify when parsing finishes. +Not called if parsing was interrupted.") + +(defvar js2-is-eval-code nil + "True if we're evaluating code in a string. +If non-nil, the tokenizer will record the token text, and the AST nodes +will record their source text. Off by default for IDE modes, since the +text is available in the buffer.") +(make-variable-buffer-local 'js2-is-eval-code) + +(defvar js2-parse-ide-mode t + "Non-nil if the parser is being used for `js2-mode'. +If non-nil, the parser will set text properties for fontification +and the syntax-table. The value should be nil when using the +parser as a frontend to an interpreter or byte compiler.") + +;;; Parser instance variables (buffer-local vars for js2-parse) + +(defconst js2-clear-ti-mask #xFFFF + "Mask to clear token information bits.") + +(defconst js2-ti-after-eol (lsh 1 16) + "Flag: first token of the source line.") + +(defconst js2-ti-check-label (lsh 1 17) + "Flag: indicates to check for label.") + +(defconst js2-ti-after-comment (lsh 1 18) + "Flag: indicates token followed a comment.") + +;; Inline Rhino's CompilerEnvirons vars as buffer-locals. + +(defvar js2-compiler-generate-debug-info t) +(make-variable-buffer-local 'js2-compiler-generate-debug-info) + +(defvar js2-compiler-use-dynamic-scope nil) +(make-variable-buffer-local 'js2-compiler-use-dynamic-scope) + +(defvar js2-compiler-reserved-keywords-as-identifier nil) +(make-variable-buffer-local 'js2-compiler-reserved-keywords-as-identifier) + +(defvar js2-compiler-xml-available t) +(make-variable-buffer-local 'js2-compiler-xml-available) + +(defvar js2-compiler-optimization-level 0) +(make-variable-buffer-local 'js2-compiler-optimization-level) + +(defvar js2-compiler-generating-source t) +(make-variable-buffer-local 'js2-compiler-generating-source) + +(defvar js2-compiler-strict-mode nil) +(make-variable-buffer-local 'js2-compiler-strict-mode) + +(defvar js2-compiler-report-warning-as-error nil) +(make-variable-buffer-local 'js2-compiler-report-warning-as-error) + +(defvar js2-compiler-generate-observer-count nil) +(make-variable-buffer-local 'js2-compiler-generate-observer-count) + +(defvar js2-compiler-activation-names nil) +(make-variable-buffer-local 'js2-compiler-activation-names) + +;; SKIP: sourceURI + +;; There's a compileFunction method in Context.java - may need it. +(defvar js2-called-by-compile-function nil + "True if `js2-parse' was called by `js2-compile-function'.") +(make-variable-buffer-local 'js2-called-by-compile-function) + +;; SKIP: ts (we just call `js2-init-scanner' and use its vars) + +(defvar js2-current-flagged-token js2-EOF) +(make-variable-buffer-local 'js2-current-flagged-token) + +(defvar js2-current-token js2-EOF) +(make-variable-buffer-local 'js2-current-token) + +;; SKIP: node factory - we're going to just call functions directly, +;; and eventually go to a unified AST format. + +(defvar js2-nesting-of-function 0) +(make-variable-buffer-local 'js2-nesting-of-function) + +(defvar js2-recorded-assignments nil) +(make-variable-buffer-local 'js2-assignments-from-parse) + +;; SKIP: decompiler +;; SKIP: encoded-source + +;;; These variables are per-function and should be saved/restored +;;; during function parsing. + +(defvar js2-current-script-or-fn nil) +(make-variable-buffer-local 'js2-current-script-or-fn) + +(defvar js2-current-scope nil) +(make-variable-buffer-local 'js2-current-scope) + +(defvar js2-nesting-of-with 0) +(make-variable-buffer-local 'js2-nesting-of-with) + +(defvar js2-label-set nil + "An alist mapping label names to nodes.") +(make-variable-buffer-local 'js2-label-set) + +(defvar js2-loop-set nil) +(make-variable-buffer-local 'js2-loop-set) + +(defvar js2-loop-and-switch-set nil) +(make-variable-buffer-local 'js2-loop-and-switch-set) + +(defvar js2-has-return-value nil) +(make-variable-buffer-local 'js2-has-return-value) + +(defvar js2-end-flags 0) +(make-variable-buffer-local 'js2-end-flags) + +;; These flags enumerate the possible ways a statement/function can +;; terminate. These flags are used by endCheck() and by the Parser to +;; detect inconsistent return usage. +;; +;; END_UNREACHED is reserved for code paths that are assumed to always be +;; able to execute (example: throw, continue) +;; +;; END_DROPS_OFF indicates if the statement can transfer control to the +;; next one. Statement such as return dont. A compound statement may have +;; some branch that drops off control to the next statement. +;; +;; END_RETURNS indicates that the statement can return (without arguments) +;; END_RETURNS_VALUE indicates that the statement can return a value. +;; +;; A compound statement such as +;; if (condition) { +;; return value; +;; } +;; Will be detected as (END_DROPS_OFF | END_RETURN_VALUE) by endCheck() + +(defconst js2-end-unreached #x0) +(defconst js2-end-drops-off #x1) +(defconst js2-end-returns #x2) +(defconst js2-end-returns-value #x4) +(defconst js2-end-yields #x8) + +;; Rhino awkwardly passes a statementLabel parameter to the +;; statementHelper() function, the main statement parser, which +;; is then used by quite a few of the sub-parsers. We just make +;; it a buffer-local variable and make sure it's cleaned up properly. +(defvar js2-statement-label nil) ; type `js2-labeled-stmt-node' +(make-variable-buffer-local 'js2-statement-label) + +;; Similarly, Rhino passes an inForInit boolean through about half +;; the expression parsers. We use a dynamically-scoped variable, +;; which makes it easier to funcall the parsers individually without +;; worrying about whether they take the parameter or not. +(defvar js2-in-for-init nil) +(make-variable-buffer-local 'js2-in-for-init) + +(defvar js2-temp-name-counter 0) +(make-variable-buffer-local 'js2-temp-name-counter) + +(defvar js2-parse-stmt-count 0) +(make-variable-buffer-local 'js2-parse-stmt-count) + +(defsubst js2-get-next-temp-name () + (format "$%d" (incf js2-temp-name-counter))) + +;;; end of per function variables + +(defvar js2-parse-interruptable-p t + "Set this to nil to force parse to continue until finished. +This will mostly be useful for interpreters.") + +(defvar js2-statements-per-pause 50 + "Pause after this many statements to check for user input. +If user input is pending, stop the parse and discard the tree. +This makes for a smoother user experience for large files. +You may have to wait a second or two before the highlighting +and error-reporting appear, but you can always type ahead if +you wish. This appears to be more or less how Eclipse, IntelliJ +and other editors work.") + +(defvar js2-record-comments t + "Instructs the scanner to record comments in `js2-scanned-comments'.") +(make-variable-buffer-local 'js2-record-comments) + +(defvar js2-scanned-comments nil + "List of all comments from the current parse.") +(make-variable-buffer-local 'js2-scanned-comments) + +(defun js2-underline-color (color) + "Return a legal value for the :underline face attribute based on COLOR." + ;; In XEmacs the :underline attribute can only be a boolean. + ;; In GNU it can be the name of a colour. + (if (featurep 'xemacs) + (if color t nil) + color)) + +(defcustom js2-mode-indent-inhibit-undo nil + "Non-nil to disable collection of Undo information when indenting lines. +Some users have requested this behavior. It's nil by default because +other Emacs modes don't work this way." + :type 'boolean + :group 'js2-mode) + +(defcustom js2-mode-indent-ignore-first-tab nil + "If non-nil, ignore first TAB keypress if we look indented properly. +It's fairly common for users to navigate to an already-indented line +and press TAB for reassurance that it's been indented. For this class +of users, we want the first TAB press on a line to be ignored if the +line is already indented to one of the precomputed alternatives. + +This behavior is only partly implemented. If you TAB-indent a line, +navigate to another line, and then navigate back, it fails to clear +the last-indented variable, so it thinks you've already hit TAB once, +and performs the indent. A full solution would involve getting on the +point-motion hooks for the entire buffer. If we come across another +use cases that requires watching point motion, I'll consider doing it. + +If you set this variable to nil, then the TAB key will always change +the indentation of the current line, if more than one alternative +indentation spot exists." + :type 'boolean + :group 'js2-mode) + +(defvar js2-indent-hook nil + "A hook for user-defined indentation rules. + +Functions on this hook should expect two arguments: (LIST INDEX) +The LIST argument is the list of computed indentation points for +the current line. INDEX is the list index of the indentation point +that `js2-bounce-indent' plans to use. If INDEX is nil, then the +indent function is not going to change the current line indentation. + +If a hook function on this list returns a non-nil value, then +`js2-bounce-indent' assumes the hook function has performed its own +indentation, and will do nothing. If all hook functions on the list +return nil, then `js2-bounce-indent' will use its computed indentation +and reindent the line. + +When hook functions on this hook list are called, the variable +`js2-mode-ast' may or may not be set, depending on whether the +parse tree is available. If the variable is nil, you can pass a +callback to `js2-mode-wait-for-parse', and your callback will be +called after the new parse tree is built. This can take some time +in large files.") + +(defface js2-warning-face + `((((class color) (background light)) + (:underline ,(js2-underline-color "orange"))) + (((class color) (background dark)) + (:underline ,(js2-underline-color "orange"))) + (t (:underline t))) + "Face for JavaScript warnings." + :group 'js2-mode) + +(defface js2-error-face + `((((class color) (background light)) + (:foreground "red")) + (((class color) (background dark)) + (:foreground "red")) + (t (:foreground "red"))) + "Face for JavaScript errors." + :group 'js2-mode) + +(defface js2-jsdoc-tag-face + '((t :foreground "SlateGray")) + "Face used to highlight @whatever tags in jsdoc comments." + :group 'js2-mode) + +(defface js2-jsdoc-type-face + '((t :foreground "SteelBlue")) + "Face used to highlight {FooBar} types in jsdoc comments." + :group 'js2-mode) + +(defface js2-jsdoc-value-face + '((t :foreground "PeachPuff3")) + "Face used to highlight tag values in jsdoc comments." + :group 'js2-mode) + +(defface js2-function-param-face + '((t :foreground "SeaGreen")) + "Face used to highlight function parameters in javascript." + :group 'js2-mode) + +(defface js2-instance-member-face + '((t :foreground "DarkOrchid")) + "Face used to highlight instance variables in javascript. +Not currently used." + :group 'js2-mode) + +(defface js2-private-member-face + '((t :foreground "PeachPuff3")) + "Face used to highlight calls to private methods in javascript. +Not currently used." + :group 'js2-mode) + +(defface js2-private-function-call-face + '((t :foreground "goldenrod")) + "Face used to highlight calls to private functions in javascript. +Not currently used." + :group 'js2-mode) + +(defface js2-jsdoc-html-tag-name-face + (if js2-emacs22 + '((((class color) (min-colors 88) (background light)) + (:foreground "rosybrown")) + (((class color) (min-colors 8) (background dark)) + (:foreground "yellow")) + (((class color) (min-colors 8) (background light)) + (:foreground "magenta"))) + '((((type tty pc) (class color) (background light)) + (:foreground "magenta")) + (((type tty pc) (class color) (background dark)) + (:foreground "yellow")) + (t (:foreground "RosyBrown")))) + "Face used to highlight jsdoc html tag names" + :group 'js2-mode) + +(defface js2-jsdoc-html-tag-delimiter-face + (if js2-emacs22 + '((((class color) (min-colors 88) (background light)) + (:foreground "dark khaki")) + (((class color) (min-colors 8) (background dark)) + (:foreground "green")) + (((class color) (min-colors 8) (background light)) + (:foreground "green"))) + '((((type tty pc) (class color) (background light)) + (:foreground "green")) + (((type tty pc) (class color) (background dark)) + (:foreground "green")) + (t (:foreground "dark khaki")))) + "Face used to highlight brackets in jsdoc html tags." + :group 'js2-mode) + +(defface js2-external-variable-face + '((t :foreground "orange")) + "Face used to highlight assignments to undeclared variables. +An undeclared variable is any variable not declared with var or let +in the current scope or any lexically enclosing scope. If you assign +to such a variable, then you are either expecting it to originate from +another file, or you've got a potential bug." + :group 'js2-mode) + +(defcustom js2-highlight-external-variables t + "Non-nil to higlight assignments to undeclared variables." + :type 'boolean + :group 'js2-mode) + +(defvar js2-mode-map + (let ((map (make-sparse-keymap)) + keys) + (define-key map [mouse-1] #'js2-mode-show-node) + (define-key map "\C-m" #'js2-enter-key) + (when js2-rebind-eol-bol-keys + (define-key map "\C-a" #'js2-beginning-of-line) + (define-key map "\C-e" #'js2-end-of-line)) + (define-key map "\C-c\C-e" #'js2-mode-hide-element) + (define-key map "\C-c\C-s" #'js2-mode-show-element) + (define-key map "\C-c\C-a" #'js2-mode-show-all) + (define-key map "\C-c\C-f" #'js2-mode-toggle-hide-functions) + (define-key map "\C-c\C-t" #'js2-mode-toggle-hide-comments) + (define-key map "\C-c\C-o" #'js2-mode-toggle-element) + (define-key map "\C-c\C-w" #'js2-mode-toggle-warnings-and-errors) + (define-key map (kbd "C-c C-'") #'js2-next-error) + ;; also define user's preference for next-error, if available + (if (setq keys (where-is-internal #'next-error)) + (define-key map (car keys) #'js2-next-error)) + (define-key map (or (car (where-is-internal #'mark-defun)) + (kbd "M-C-h")) + #'js2-mark-defun) + (define-key map (or (car (where-is-internal #'narrow-to-defun)) + (kbd "C-x nd")) + #'js2-narrow-to-defun) + (define-key map [down-mouse-3] #'js2-mouse-3) + (when js2-auto-indent-flag + (mapc (lambda (key) + (define-key map key #'js2-insert-and-indent)) + js2-electric-keys)) + + (define-key map [menu-bar javascript] + (cons "JavaScript" (make-sparse-keymap "JavaScript"))) + + (define-key map [menu-bar javascript customize-js2-mode] + '(menu-item "Customize js2-mode" js2-mode-customize + :help "Customize the behavior of this mode")) + + (define-key map [menu-bar javascript js2-force-refresh] + '(menu-item "Force buffer refresh" js2-mode-reset + :help "Re-parse the buffer from scratch")) + + (define-key map [menu-bar javascript separator-2] + '("--")) + + (define-key map [menu-bar javascript next-error] + '(menu-item "Next warning or error" js2-next-error + :enabled (and js2-mode-ast + (or (js2-ast-root-errors js2-mode-ast) + (js2-ast-root-warnings js2-mode-ast))) + :help "Move to next warning or error")) + + (define-key map [menu-bar javascript display-errors] + '(menu-item "Show errors and warnings" js2-mode-display-warnings-and-errors + :visible (not js2-mode-show-parse-errors) + :help "Turn on display of warnings and errors")) + + (define-key map [menu-bar javascript hide-errors] + '(menu-item "Hide errors and warnings" js2-mode-hide-warnings-and-errors + :visible js2-mode-show-parse-errors + :help "Turn off display of warnings and errors")) + + (define-key map [menu-bar javascript separator-1] + '("--")) + + (define-key map [menu-bar javascript js2-toggle-function] + '(menu-item "Show/collapse element" js2-mode-toggle-element + :help "Hide or show function body or comment")) + + (define-key map [menu-bar javascript show-comments] + '(menu-item "Show block comments" js2-mode-toggle-hide-comments + :visible js2-mode-comments-hidden + :help "Expand all hidden block comments")) + + (define-key map [menu-bar javascript hide-comments] + '(menu-item "Hide block comments" js2-mode-toggle-hide-comments + :visible (not js2-mode-comments-hidden) + :help "Show block comments as /*...*/")) + + (define-key map [menu-bar javascript show-all-functions] + '(menu-item "Show function bodies" js2-mode-toggle-hide-functions + :visible js2-mode-functions-hidden + :help "Expand all hidden function bodies")) + + (define-key map [menu-bar javascript hide-all-functions] + '(menu-item "Hide function bodies" js2-mode-toggle-hide-functions + :visible (not js2-mode-functions-hidden) + :help "Show {...} for all top-level function bodies")) + + map) + "Keymap used in `js2-mode' buffers.") + +(defconst js2-mode-identifier-re "[a-zA-Z_$][a-zA-Z0-9_$]*") + +(defvar js2-mode-//-comment-re "^\\(\\s-*\\)//.+" + "Matches a //-comment line. Must be first non-whitespace on line. +First match-group is the leading whitespace.") + +(defvar js2-mode-ast nil "Private variable.") +(make-variable-buffer-local 'js2-mode-ast) + +(defvar js2-mode-hook nil) + +(defvar js2-mode-parse-timer nil "Private variable.") +(make-variable-buffer-local 'js2-mode-parse-timer) + +(defvar js2-mode-buffer-dirty-p nil "Private variable.") +(make-variable-buffer-local 'js2-mode-buffer-dirty-p) + +(defvar js2-mode-parsing nil "Private variable.") +(make-variable-buffer-local 'js2-mode-parsing) + +(defvar js2-mode-node-overlay nil) +(make-variable-buffer-local 'js2-mode-node-overlay) + +(defvar js2-mode-show-overlay js2-mode-dev-mode-p + "Debug: Non-nil to highlight AST nodes on mouse-down.") + +(defvar js2-mode-fontifications nil "Private variable") +(make-variable-buffer-local 'js2-mode-fontifications) + +(defvar js2-mode-deferred-properties nil "Private variable") +(make-variable-buffer-local 'js2-mode-deferred-properties) + +(defvar js2-imenu-recorder nil "Private variable") +(make-variable-buffer-local 'js2-imenu-recorder) + +(defvar js2-imenu-function-map nil "Private variable") +(make-variable-buffer-local 'js2-imenu-function-map) + +(defvar js2-paragraph-start + "\\(@[a-zA-Z]+\\>\\|$\\)") + +;; Note that we also set a 'c-in-sws text property in html comments, +;; so that `c-forward-sws' and `c-backward-sws' work properly. +(defvar js2-syntactic-ws-start + "\\s \\|/[*/]\\|[\n\r]\\|\\\\[\n\r]\\|\\s!\\|") + +(defvar js2-syntactic-ws-end + "\\s \\|[\n\r/]\\|\\s!") + +(defvar js2-syntactic-eol + (concat "\\s *\\(/\\*[^*\n\r]*" + "\\(\\*+[^*\n\r/][^*\n\r]*\\)*" + "\\*+/\\s *\\)*" + "\\(//\\|/\\*[^*\n\r]*" + "\\(\\*+[^*\n\r/][^*\n\r]*\\)*$" + "\\|\\\\$\\|$\\)") + "Copied from java-mode. Needed for some cc-engine functions.") + +(defvar js2-comment-prefix-regexp + "//+\\|\\**") + +(defvar js2-comment-start-skip + "\\(//+\\|/\\*+\\)\\s *") + +(defvar js2-mode-verbose-parse-p js2-mode-dev-mode-p + "Non-nil to emit status messages during parsing.") + +(defvar js2-mode-functions-hidden nil "private variable") +(defvar js2-mode-comments-hidden nil "private variable") + +(defvar js2-mode-syntax-table + (let ((table (make-syntax-table))) + (c-populate-syntax-table table) + table) + "Syntax table used in js2-mode buffers.") + +(defvar js2-mode-abbrev-table nil + "Abbrev table in use in `js2-mode' buffers.") +(define-abbrev-table 'js2-mode-abbrev-table ()) + +(defvar js2-mode-must-byte-compile (not js2-mode-dev-mode-p) + "Non-nil to have `js2-mode' signal an error if not byte-compiled.") + +(defvar js2-mode-pending-parse-callbacks nil + "List of functions waiting to be notified that parse is finished.") + +(defvar js2-mode-last-indented-line -1) + +(eval-when-compile + (defvar c-paragraph-start nil) + (defvar c-paragraph-separate nil) + (defvar c-syntactic-ws-start nil) + (defvar c-syntactic-ws-end nil) + (defvar c-syntactic-eol nil) + (defvar running-xemacs nil)) + +(eval-when-compile + (if (< emacs-major-version 22) + (defun c-setup-paragraph-variables () nil))) + +(provide 'js2-vars) + +;;; js2-vars.el ends here +;;; js2-util.el -- JavaScript utilities + +;; Author: Steve Yegge (steve.yegge@gmail.com) +;; Keywords: javascript languages + +;;; Code + +(eval-when-compile + (require 'cl)) + + +;; Emacs21 compatibility, plus some stuff to avoid runtime dependency on CL + +(unless (fboundp #'looking-back) + (defun looking-back (regexp &optional limit greedy) + "Return non-nil if text before point matches regular expression REGEXP. +Like `looking-at' except matches before point, and is slower. +LIMIT if non-nil speeds up the search by specifying a minimum +starting position, to avoid checking matches that would start +before LIMIT. + +If GREEDY is non-nil, extend the match backwards as far as possible, +stopping when a single additional previous character cannot be part +of a match for REGEXP." + (let ((start (point)) + (pos + (save-excursion + (and (re-search-backward (concat "\\(?:" regexp "\\)\\=") limit t) + (point))))) + (if (and greedy pos) + (save-restriction + (narrow-to-region (point-min) start) + (while (and (> pos (point-min)) + (save-excursion + (goto-char pos) + (backward-char 1) + (looking-at (concat "\\(?:" regexp "\\)\\'")))) + (setq pos (1- pos))) + (save-excursion + (goto-char pos) + (looking-at (concat "\\(?:" regexp "\\)\\'"))))) + (not (null pos))))) + +(unless (fboundp #'copy-overlay) + (defun copy-overlay (o) + "Return a copy of overlay O." + (let ((o1 (make-overlay (overlay-start o) (overlay-end o) + ;; FIXME: there's no easy way to find the + ;; insertion-type of the two markers. + (overlay-buffer o))) + (props (overlay-properties o))) + (while props + (overlay-put o1 (pop props) (pop props))) + o1))) + +(unless (fboundp #'remove-overlays) + (defun remove-overlays (&optional beg end name val) + "Clear BEG and END of overlays whose property NAME has value VAL. +Overlays might be moved and/or split. +BEG and END default respectively to the beginning and end of buffer." + (unless beg (setq beg (point-min))) + (unless end (setq end (point-max))) + (if (< end beg) + (setq beg (prog1 end (setq end beg)))) + (save-excursion + (dolist (o (overlays-in beg end)) + (when (eq (overlay-get o name) val) + ;; Either push this overlay outside beg...end + ;; or split it to exclude beg...end + ;; or delete it entirely (if it is contained in beg...end). + (if (< (overlay-start o) beg) + (if (> (overlay-end o) end) + (progn + (move-overlay (copy-overlay o) + (overlay-start o) beg) + (move-overlay o end (overlay-end o))) + (move-overlay o (overlay-start o) beg)) + (if (> (overlay-end o) end) + (move-overlay o end (overlay-end o)) + (delete-overlay o)))))))) + +;; we don't want a runtime dependency on the CL package, so define +;; our own versions of these functions. + +(defun js2-delete-if (predicate list) + "Remove all items satisfying PREDICATE in LIST." + (loop for item in list + if (not (funcall predicate item)) + collect item)) + +(defun js2-position (element list) + "Find 0-indexed position of ELEMENT in LIST comparing with `eq'. +Returns nil if element is not found in the list." + (let ((count 0) + found) + (while (and list (not found)) + (if (eq element (car list)) + (setq found t) + (setq count (1+ count) + list (cdr list)))) + (if found count))) + +(defun js2-find-if (predicate list) + "Find first item satisfying PREDICATE in LIST." + (let (result) + (while (and list (not result)) + (if (funcall predicate (car list)) + (setq result (car list))) + (setq list (cdr list))) + result)) + +;;; end Emacs 21 compat + +(defmacro js2-time (form) + "Evaluate FORM, discard result, and return elapsed time in sec" + (let ((beg (make-symbol "--js2-time-beg--")) + (delta (make-symbol "--js2-time-end--"))) + `(let ((,beg (current-time)) + ,delta) + ,form + (/ (truncate (* (- (float-time (current-time)) + (float-time ,beg))) + 10000) + 10000.0)))) + +(def-edebug-spec js2-time t) + +(defsubst neq (expr1 expr2) + "Return (not (eq expr1 expr2))." + (not (eq expr1 expr2))) + +(defsubst js2-same-line (pos) + "Return t if POS is on the same line as current point." + (and (>= pos (point-at-bol)) + (<= pos (point-at-eol)))) + +(defsubst js2-same-line-2 (p1 p2) + "Return t if p1 is on the same line as p2." + (save-excursion + (goto-char p1) + (js2-same-line p2))) + +(defun js2-code-bug () + "Signal an error when we encounter an unexpected code path." + (error "failed assertion")) + +;; I'd like to associate errors with nodes, but for now the +;; easiest thing to do is get the context info from the last token. +(defsubst js2-record-parse-error (msg &optional arg pos len) + (push (list (list msg arg) + (or pos js2-token-beg) + (or len (- js2-token-end js2-token-beg))) + js2-parsed-errors)) + +(defsubst js2-report-error (msg &optional msg-arg pos len) + "Signal a syntax error or record a parse error." + (if js2-recover-from-parse-errors + (js2-record-parse-error msg msg-arg pos len) + (signal 'js2-syntax-error + (list msg + js2-ts-lineno + (save-excursion + (goto-char js2-ts-cursor) + (current-column)) + js2-ts-hit-eof)))) + +(defsubst js2-report-warning (msg &optional msg-arg pos len) + (if js2-compiler-report-warning-as-error + (js2-report-error msg msg-arg pos len) + (push (list (list msg msg-arg) + (or pos js2-token-beg) + (or len (- js2-token-end js2-token-beg))) + js2-parsed-warnings))) + +(defsubst js2-add-strict-warning (msg-id &optional msg-arg beg end) + (if js2-compiler-strict-mode + (js2-report-warning msg-id msg-arg beg + (and beg end (- end beg))))) + +(put 'js2-syntax-error 'error-conditions + '(error syntax-error js2-syntax-error)) +(put 'js2-syntax-error 'error-message "Syntax error") + +(put 'js2-parse-error 'error-conditions + '(error parse-error js2-parse-error)) +(put 'js2-parse-error 'error-message "Parse error") + +(defalias 'set-flag 'logior) + +(defsubst flag-set-p (flags flag) + (plusp (logand flags flag))) + +;; Stolen shamelessly from James Clark's nxml-mode. +(defmacro js2-with-unmodifying-text-property-changes (&rest body) + "Evaluate BODY without any text property changes modifying the buffer. +Any text properties changes happen as usual but the changes are not treated as +modifications to the buffer." + (let ((modified (make-symbol "modified"))) + `(let ((,modified (buffer-modified-p)) + (inhibit-read-only t) + (inhibit-modification-hooks t) + (buffer-undo-list t) + (deactivate-mark nil) + ;; Apparently these avoid file locking problems. + (buffer-file-name nil) + (buffer-file-truename nil)) + (unwind-protect + (progn ,@body) + (unless ,modified + (restore-buffer-modified-p nil)))))) + +(put 'js2-with-unmodifying-text-property-changes 'lisp-indent-function 0) +(def-edebug-spec js2-with-unmodifying-text-property-changes t) + +(defmacro js2-with-underscore-as-word-syntax (&rest body) + "Evaluate BODY with the _ character set to be word-syntax." + (let ((old-syntax (make-symbol "old-syntax"))) + `(let ((,old-syntax (string (char-syntax ?_)))) + (unwind-protect + (progn + (modify-syntax-entry ?_ "w" js2-mode-syntax-table) + ,@body) + (modify-syntax-entry ?_ ,old-syntax js2-mode-syntax-table))))) + +(put 'js2-with-underscore-as-word-syntax 'lisp-indent-function 0) +(def-edebug-spec js2-with-underscore-as-word-syntax t) + +(defmacro with-buffer (buf form) + "Executes FORM in buffer BUF. +BUF can be a buffer name or a buffer object. +If the buffer doesn't exist, it's created." + `(let ((buffer (gentemp))) + (setq buffer + (if (stringp ,buf) + (get-buffer-create ,buf) + ,buf)) + (save-excursion + (set-buffer buffer) + ,form))) + +(defsubst char-is-uppercase (c) + "Return t if C is an uppercase character. +Handles unicode and latin chars properly." + (/= c (downcase c))) + +(defsubst char-is-lowercase (c) + "Return t if C is an uppercase character. +Handles unicode and latin chars properly." + (/= c (upcase c))) + +(put 'with-buffer 'lisp-indent-function 1) +(def-edebug-spec with-buffer t) + +(provide 'js2-util) + +;;; js2-util.el ends here +;;; js2-scan.el --- JavaScript scanner + +;; Author: Steve Yegge (steve.yegge@gmail.com) +;; Keywords: javascript languages + +;;; Commentary: + +;; A port of Mozilla Rhino's scanner. +;; Corresponds to Rhino files Token.java and TokenStream.java. + +;;; Code: + + +(eval-when-compile + (require 'cl)) + +(defvar js2-tokens nil + "List of all defined token names.") ; intialized below + +(defvar js2-token-names + (let* ((names (make-vector js2-num-tokens -1)) + (case-fold-search nil) ; only match js2-UPPER_CASE + (syms (apropos-internal "^js2-\\(?:[A-Z_]+\\)"))) + (loop for sym in syms + for i from 0 + do + (unless (or (memq sym '(js2-EOF_CHAR js2-ERROR)) + (not (boundp sym))) + (aset names (symbol-value sym) ; code, e.g. 152 + (substring (symbol-name sym) 4)) ; name, e.g. "LET" + (push sym js2-tokens))) + names) + "Vector mapping int values to token string names, sans `js2-' prefix.") + +(defun js2-token-name (tok) + "Return a string name for TOK, a token symbol or code. +Signals an error if it's not a recognized token." + (let ((code tok)) + (if (symbolp tok) + (setq code (symbol-value tok))) + (if (eq code -1) + "ERROR" + (if (and (numberp code) + (not (minusp code)) + (< code js2-num-tokens)) + (aref js2-token-names code) + (error "Invalid token: %s" code))))) + +(defsubst js2-token-sym (tok) + "Return symbol for TOK given its code, e.g. 'js2-LP for code 86." + (intern (js2-token-name tok))) + +(defvar js2-token-codes + (let ((table (make-hash-table :test 'eq :size 256))) + (loop for name across js2-token-names + for sym = (intern (concat "js2-" name)) + do + (puthash sym (symbol-value sym) table)) + ;; clean up a few that are "wrong" in Rhino's token codes + (puthash 'js2-DELETE js2-DELPROP table) + table) + "Hashtable mapping token symbols to their bytecodes.") + +(defsubst js2-token-code (sym) + "Return code for token symbol SYM, e.g. 86 for 'js2-LP." + (or (gethash sym js2-token-codes) + (error "Invalid token symbol: %s " sym))) ; signal code bug + +(defsubst js2-report-scan-error (msg &optional no-throw) + (setq js2-token-end js2-ts-cursor) + (js2-report-error msg nil js2-token-beg + (- js2-token-end js2-token-beg)) + (unless no-throw + (throw 'return js2-ERROR))) + +(defsubst js2-get-string-from-buffer () + "Reverse the char accumulator and return it as a string." + (setq js2-token-end js2-ts-cursor) + (if js2-ts-string-buffer + (apply #'string (nreverse js2-ts-string-buffer)) + "")) + +;; TODO: could potentially avoid a lot of consing by allocating a +;; char buffer the way Rhino does. +(defsubst js2-add-to-string (c) + (push c js2-ts-string-buffer)) + +;; Note that when we "read" the end-of-file, we advance js2-ts-cursor +;; to (1+ (point-max)), which lets the scanner treat end-of-file like +;; any other character: when it's not part of the current token, we +;; unget it, allowing it to be read again by the following call. +(defsubst js2-unget-char () + (decf js2-ts-cursor)) + +;; Rhino distinguishes \r and \n line endings. We don't need to +;; because we only scan from Emacs buffers, which always use \n. +(defsubst js2-get-char () + "Read and return the next character from the input buffer. +Increments `js2-ts-lineno' if the return value is a newline char. +Updates `js2-ts-cursor' to the point after the returned char. +Returns `js2-EOF_CHAR' if we hit the end of the buffer. +Also updates `js2-ts-hit-eof' and `js2-ts-line-start' as needed." + (let (c) + ;; check for end of buffer + (if (>= js2-ts-cursor (point-max)) + (setq js2-ts-hit-eof t + js2-ts-cursor (1+ js2-ts-cursor) + c js2-EOF_CHAR) ; return value + + ;; otherwise read next char + (setq c (char-before (incf js2-ts-cursor))) + + ;; if we read a newline, update counters + (if (= c ?\n) + (setq js2-ts-line-start js2-ts-cursor + js2-ts-lineno (1+ js2-ts-lineno))) + + ;; TODO: skip over format characters + c))) + +(defsubst js2-read-unicode-escape () + "Read a \\uNNNN sequence from the input. +Assumes the ?\ and ?u have already been read. +Returns the unicode character, or nil if it wasn't a valid character. +Doesn't change the values of any scanner variables." + ;; I really wish I knew a better way to do this, but I can't + ;; find the Emacs function that takes a 16-bit int and converts + ;; it to a Unicode/utf-8 character. So I basically eval it with (read). + ;; Have to first check that it's 4 hex characters or it may stop + ;; the read early. + (ignore-errors + (let ((s (buffer-substring-no-properties js2-ts-cursor + (+ 4 js2-ts-cursor)))) + (if (string-match "[a-zA-Z0-9]\\{4\\}" s) + (read (concat "?\\u" s)))))) + +(defsubst js2-match-char (test) + "Consume and return next character if it matches TEST, a character. +Returns nil and consumes nothing if TEST is not the next character." + (let ((c (js2-get-char))) + (if (eq c test) + t + (js2-unget-char) + nil))) + +(defsubst js2-peek-char () + (prog1 + (js2-get-char) + (js2-unget-char))) + +(defsubst js2-java-identifier-start-p (c) + (or + (memq c '(?$ ?_)) + (char-is-uppercase c) + (char-is-lowercase c))) + +(defsubst js2-java-identifier-part-p (c) + "Implementation of java.lang.Character.isJavaIdentifierPart()" + ;; TODO: make me Unicode-friendly. See comments above. + (or + (memq c '(?$ ?_)) + (char-is-uppercase c) + (char-is-lowercase c) + (and (>= c ?0) (<= c ?9)))) + +(defsubst js2-alpha-p (c) + ;; Use 'Z' < 'a' + (if (<= c ?Z) + (<= ?A c) + (and (<= ?a c) + (<= c ?z)))) + +(defsubst js2-digit-p (c) + (and (<= ?0 c) (<= c ?9))) + +(defsubst js2-js-space-p (c) + (if (<= c 127) + (memq c '(#x20 #x9 #xC #xB)) + (or + (eq c #xA0) + ;; TODO: change this nil to check for Unicode space character + nil))) + +(defsubst js2-skip-line () + "Skip to end of line" + (let (c) + (while (and (/= js2-EOF_CHAR (setq c (js2-get-char))) + (/= c ?\n))) + (setq js2-token-end js2-ts-cursor) + (js2-unget-char))) + +(defun js2-init-scanner (&optional buf line) + "Create token stream for BUF starting on LINE. +BUF defaults to current-buffer and line defaults to 1. + +A buffer can only have one scanner active at a time, which yields +dramatically simpler code than using a defstruct. If you need to +have simultaneous scanners in a buffer, copy the regions to scan +into temp buffers." + (save-excursion + (when buf + (set-buffer buf)) + (setq js2-ts-dirty-line nil + js2-ts-regexp-flags nil + js2-ts-string "" + js2-ts-number nil + js2-ts-hit-eof nil + js2-ts-line-start 0 + js2-ts-lineno (or line 1) + js2-ts-line-end-char -1 + js2-ts-cursor (point-min) + js2-ts-is-xml-attribute nil + js2-ts-xml-is-tag-content nil + js2-ts-xml-open-tags-count 0 + js2-ts-string-buffer nil))) + +;; This function uses the cached op, string and number fields in +;; TokenStream; if getToken has been called since the passed token +;; was scanned, the op or string printed may be incorrect. +(defun js2-token-to-string (token) + ;; Not sure where this function is used in Rhino. Not tested. + (if (not js2-debug-print-trees) + "" + (let ((name (js2-token-name token))) + (cond + ((memq token (list js2-STRING js2-REGEXP js2-NAME)) + (concat name " `" js2-ts-string "'")) + ((eq token js2-NUMBER) + (format "NUMBER %g" js2-ts-number)) + (t + name))))) + +(defconst js2-keywords + '(break + case catch const continue + debugger default delete do + else enum + false finally for function + if in instanceof import + let + new null + return + switch + this throw true try typeof + var void + while with + yield)) + +;; Token names aren't exactly the same as the keywords, unfortunately. +;; E.g. enum isn't in the tokens, and delete is js2-DELPROP. +(defconst js2-kwd-tokens + (let ((table (make-vector js2-num-tokens nil)) + (tokens + (list js2-BREAK + js2-CASE js2-CATCH js2-CONST js2-CONTINUE + js2-DEBUGGER js2-DEFAULT js2-DELPROP js2-DO + js2-ELSE + js2-FALSE js2-FINALLY js2-FOR js2-FUNCTION + js2-IF js2-IN js2-INSTANCEOF js2-IMPORT + js2-LET + js2-NEW js2-NULL + js2-RETURN + js2-SWITCH + js2-THIS js2-THROW js2-TRUE js2-TRY js2-TYPEOF + js2-VAR + js2-WHILE js2-WITH + js2-YIELD))) + (dolist (i tokens) + (aset table i 'font-lock-keyword-face)) + (aset table js2-STRING 'font-lock-string-face) + (aset table js2-REGEXP 'font-lock-string-face) + (aset table js2-COMMENT 'font-lock-comment-face) + (aset table js2-THIS 'font-lock-builtin-face) + (aset table js2-VOID 'font-lock-constant-face) + (aset table js2-NULL 'font-lock-constant-face) + (aset table js2-TRUE 'font-lock-constant-face) + (aset table js2-FALSE 'font-lock-constant-face) + table) + "Vector whose values are non-nil for tokens that are keywords. +The values are default faces to use for highlighting the keywords.") + +(defconst js2-reserved-words + '(abstract + boolean byte + char class + double + enum extends + final float + goto + implements int interface + long + native + package private protected public + short static super synchronized + throws transient + volatile)) + +(defconst js2-keyword-names + (let ((table (make-hash-table :test 'equal))) + (loop for k in js2-keywords + do (puthash + (symbol-name k) ; instanceof + (intern (concat "js2-" + (upcase (symbol-name k)))) ; js2-INSTANCEOF + table)) + table) + "JavaScript keywords by name, mapped to their symbols.") + +(defconst js2-reserved-word-names + (let ((table (make-hash-table :test 'equal))) + (loop for k in js2-reserved-words + do + (puthash (symbol-name k) 'js2-RESERVED table)) + table) + "JavaScript reserved words by name, mapped to 'js2-RESERVED.") + +(defsubst js2-collect-string (buf) + "Convert BUF, a list of chars, to a string. +Reverses BUF before converting." + (cond + ((stringp buf) + buf) + ((null buf) ; for emacs21 compat + "") + (t + (if buf + (apply #'string (nreverse buf)) + "")))) + +(defun js2-string-to-keyword (s) + "Return token for S, a string, if S is a keyword or reserved word. +Returns a symbol such as 'js2-BREAK, or nil if not keyword/reserved." + (or (gethash s js2-keyword-names) + (gethash s js2-reserved-word-names))) + +(defsubst js2-ts-set-char-token-bounds () + "Used when next token is one character." + (setq js2-token-beg (1- js2-ts-cursor) + js2-token-end js2-ts-cursor)) + +(defsubst js2-ts-return (token) + "Return an N-character TOKEN from `js2-get-token'. +Updates `js2-token-end' accordingly." + (setq js2-token-end js2-ts-cursor) + (throw 'return token)) + +(defsubst js2-x-digit-to-int (c accumulator) + "Build up a hex number. +If C is a hexadecimal digit, return ACCUMULATOR * 16 plus +corresponding number. Otherwise return -1." + (catch 'return + (catch 'check + ;; Use 0..9 < A..Z < a..z + (cond + ((<= c ?9) + (decf c ?0) + (if (<= 0 c) + (throw 'check nil))) + ((<= c ?F) + (when (<= ?A c) + (decf c (- ?A 10)) + (throw 'check nil))) + ((<= c ?f) + (when (<= ?a c) + (decf c (- ?a 10)) + (throw 'check nil)))) + (throw 'return -1)) + (logior c (lsh accumulator 4)))) + +(defun js2-get-token () + "Return next JavaScript token, an int such as js2-RETURN." + (let (c + c1 + identifier-start + is-unicode-escape-start + contains-escape + escape-val + escape-start + str + result + base + is-integer + quote-char + val + look-for-slash + continue) + (catch 'return + (while t + ;; Eat whitespace, possibly sensitive to newlines. + (setq continue t) + (while continue + (setq c (js2-get-char)) + (cond + ((eq c js2-EOF_CHAR) + (js2-ts-set-char-token-bounds) + (throw 'return js2-EOF)) + ((eq c ?\n) + (js2-ts-set-char-token-bounds) + (setq js2-ts-dirty-line nil) + (throw 'return js2-EOL)) + ((not (js2-js-space-p c)) + (if (/= c ?-) ; in case end of HTML comment + (setq js2-ts-dirty-line t)) + (setq continue nil)))) + + ;; Assume the token will be 1 char - fixed up below. + (setq js2-token-beg (1- js2-ts-cursor) + js2-token-end js2-ts-cursor) + + (when (eq c ?@) + (throw 'return js2-XMLATTR)) + + ;; identifier/keyword/instanceof? + ;; watch out for starting with a + (cond + ((eq c ?\\) + (setq c (js2-get-char)) + (if (eq c ?u) + (setq identifier-start t + is-unicode-escape-start t + js2-ts-string-buffer nil) + (setq identifier-start nil) + (js2-unget-char) + (setq c ?\\))) + (t + (when (setq identifier-start (js2-java-identifier-start-p c)) + (setq js2-ts-string-buffer nil) + (js2-add-to-string c)))) + + (when identifier-start + (setq contains-escape is-unicode-escape-start) + (catch 'break + (while t + (if is-unicode-escape-start + ;; strictly speaking we should probably push-back + ;; all the bad characters if the uXXXX + ;; sequence is malformed. But since there isn't a + ;; correct context(is there?) for a bad Unicode + ;; escape sequence in an identifier, we can report + ;; an error here. + (progn + (setq escape-val 0) + (dotimes (i 4) + (setq c (js2-get-char) + escape-val (js2-x-digit-to-int c escape-val)) + ;; Next check takes care of c < 0 and bad escape + (if (minusp escape-val) + (throw 'break nil))) + (if (minusp escape-val) + (js2-report-scan-error "msg.invalid.escape" t)) + (js2-add-to-string escape-val) + (setq is-unicode-escape-start nil)) + (setq c (js2-get-char)) + (cond + ((eq c ?\\) + (setq c (js2-get-char)) + (if (eq c ?u) + (setq is-unicode-escape-start t + contains-escape t) + (js2-report-scan-error "msg.illegal.character" t))) + (t + (if (or (eq c js2-EOF_CHAR) + (not (js2-java-identifier-part-p c))) + (throw 'break nil)) + (js2-add-to-string c)))))) + (js2-unget-char) + + (setq str (js2-get-string-from-buffer)) + (unless contains-escape + ;; OPT we shouldn't have to make a string (object!) to + ;; check if it's a keyword. + + ;; Return the corresponding token if it's a keyword + (when (setq result (js2-string-to-keyword str)) + (if (and (< js2-language-version 170) + (memq result '(js2-LET js2-YIELD))) + ;; LET and YIELD are tokens only in 1.7 and later + (setq result 'js2-NAME)) + (if (neq result js2-RESERVED) + (throw 'return (js2-token-code result))) + (js2-report-warning "msg.reserved.keyword" str))) + + ;; If we want to intern these as Rhino does, just use (intern str) + (setq js2-ts-string str) + (throw 'return js2-NAME)) ; end identifier/kwd check + + ;; is it a number? + (when (or (js2-digit-p c) + (and (eq c ?.) (js2-digit-p (js2-peek-char)))) + (setq js2-ts-string-buffer nil + base 10) + (when (eq c ?0) + (setq c (js2-get-char)) + (cond + ((or (eq c ?x) (eq c ?X)) + (setq base 16) + (setq c (js2-get-char))) + ((js2-digit-p c) + (setq base 8)) + (t + (js2-add-to-string ?0)))) + + (if (eq base 16) + (while (<= 0 (js2-x-digit-to-int c 0)) + (js2-add-to-string c) + (setq c (js2-get-char))) + (while (and (<= ?0 c) (<= c ?9)) + ;; We permit 08 and 09 as decimal numbers, which + ;; makes our behavior a superset of the ECMA + ;; numeric grammar. We might not always be so + ;; permissive, so we warn about it. + (when (and (eq base 8) (>= c ?8)) + (js2-report-warning "msg.bad.octal.literal" + (if (eq c ?8) "8" "9")) + (setq base 10)) + (js2-add-to-string c) + (setq c (js2-get-char)))) + + (setq is-integer t) + + (when (and (eq base 10) (memq c '(?. ?e ?E))) + (setq is-integer nil) + (when (eq c ?.) + (loop do + (js2-add-to-string c) + (setq c (js2-get-char)) + while (js2-digit-p c))) + (when (memq c '(?e ?E)) + (js2-add-to-string c) + (setq c (js2-get-char)) + (when (memq c '(?+ ?-)) + (js2-add-to-string c) + (setq c (js2-get-char))) + (unless (js2-digit-p c) + (js2-report-scan-error "msg.missing.exponent" t)) + (loop do + (js2-add-to-string c) + (setq c (js2-get-char)) + while (js2-digit-p c)))) + + (js2-unget-char) + (setq js2-ts-string (js2-get-string-from-buffer) + js2-ts-number + (if (and (eq base 10) (not is-integer)) + (string-to-number js2-ts-string) + ;; TODO: call runtime number-parser. Some of it is in + ;; js2-util.el, but I need to port ScriptRuntime.stringToNumber. + (string-to-number js2-ts-string))) + (throw 'return js2-NUMBER)) + + ;; is it a string? + (when (memq c '(?\" ?\')) + ;; We attempt to accumulate a string the fast way, by + ;; building it directly out of the reader. But if there + ;; are any escaped characters in the string, we revert to + ;; building it out of a string buffer. + (setq quote-char c + js2-ts-string-buffer nil + c (js2-get-char)) + (catch 'break + (while (/= c quote-char) + (catch 'continue + (when (or (eq c ?\n) (eq c js2-EOF_CHAR)) + (js2-unget-char) + (setq js2-token-end js2-ts-cursor) + (js2-report-error "msg.unterminated.string.lit") + (throw 'return js2-STRING)) + + (when (eq c ?\\) + ;; We've hit an escaped character + (setq c (js2-get-char)) + (case c + (?b (setq c ?\b)) + (?f (setq c ?\f)) + (?n (setq c ?\n)) + (?r (setq c ?\r)) + (?t (setq c ?\t)) + (?v (setq c ?\v)) + (?u + (setq c1 (js2-read-unicode-escape)) + (if js2-parse-ide-mode + (if c1 + (progn + ;; just copy the string in IDE-mode + (js2-add-to-string ?\\) + (js2-add-to-string ?u) + (dotimes (i 3) + (js2-add-to-string (js2-get-char))) + (setq c (js2-get-char))) ; added at end of loop + ;; flag it as an invalid escape + (js2-report-warning "msg.invalid.escape" + nil (- js2-ts-cursor 2) 6)) + ;; Get 4 hex digits; if the u escape is not + ;; followed by 4 hex digits, use 'u' + the + ;; literal character sequence that follows. + (js2-add-to-string ?u) + (setq escape-val 0) + (dotimes (i 4) + (setq c (js2-get-char) + escape-val (js2-x-digit-to-int c escape-val)) + (if (minusp escape-val) + (throw 'continue nil)) + (js2-add-to-string c)) + ;; prepare for replace of stored 'u' sequence by escape value + (setq js2-ts-string-buffer (nthcdr 5 js2-ts-string-buffer) + c escape-val))) + (?x + ;; Get 2 hex digits, defaulting to 'x'+literal + ;; sequence, as above. + (setq c (js2-get-char) + escape-val (js2-x-digit-to-int c 0)) + (if (minusp escape-val) + (progn + (js2-add-to-string ?x) + (throw 'continue nil)) + (setq c1 c + c (js2-get-char) + escape-val (js2-x-digit-to-int c escape-val)) + (if (minusp escape-val) + (progn + (js2-add-to-string ?x) + (js2-add-to-string c1) + (throw 'continue nil)) + ;; got 2 hex digits + (setq c escape-val)))) + (?\n + ;; Remove line terminator after escape to follow + ;; SpiderMonkey and C/C++ + (setq c (js2-get-char)) + (throw 'continue nil)) + (t + (when (and (<= ?0 c) (< c ?8)) + (setq val (- c ?0) + c (js2-get-char)) + (when (and (<= ?0 c) (< c ?8)) + (setq val (- (+ (* 8 val) c) ?0) + c (js2-get-char)) + (when (and (<= ?0 c) + (< c ?8) + (< val #o37)) + ;; c is 3rd char of octal sequence only + ;; if the resulting val <= 0377 + (setq val (- (+ (* 8 val) c) ?0) + c (js2-get-char)))) + (js2-unget-char) + (setq c val))))) + (js2-add-to-string c) + (setq c (js2-get-char))))) + (setq js2-ts-string (js2-get-string-from-buffer)) + (throw 'return js2-STRING)) + + (case c + (?\; + (throw 'return js2-SEMI)) + (?\[ + (throw 'return js2-LB)) + (?\] + (throw 'return js2-RB)) + (?{ + (throw 'return js2-LC)) + (?} + (throw 'return js2-RC)) + (?\( + (throw 'return js2-LP)) + (?\) + (throw 'return js2-RP)) + (?, + (throw 'return js2-COMMA)) + (?? + (throw 'return js2-HOOK)) + (?: + (if (js2-match-char ?:) + (js2-ts-return js2-COLONCOLON) + (throw 'return js2-COLON))) + (?. + (if (js2-match-char ?.) + (js2-ts-return js2-DOTDOT) + (if (js2-match-char ?\() + (js2-ts-return js2-DOTQUERY) + (throw 'return js2-DOT)))) + (?| + (if (js2-match-char ?|) + (throw 'return js2-OR) + (if (js2-match-char ?=) + (js2-ts-return js2-ASSIGN_BITOR) + (throw 'return js2-BITOR)))) + (?^ + (if (js2-match-char ?=) + (js2-ts-return js2-ASSIGN_BITOR) + (throw 'return js2-BITXOR))) + (?& + (if (js2-match-char ?&) + (throw 'return js2-AND) + (if (js2-match-char ?=) + (js2-ts-return js2-ASSIGN_BITAND) + (throw 'return js2-BITAND)))) + (?= + (if (js2-match-char ?=) + (if (js2-match-char ?=) + (js2-ts-return js2-SHEQ) + (throw 'return js2-EQ)) + (throw 'return js2-ASSIGN))) + (?! + (if (js2-match-char ?=) + (if (js2-match-char ?=) + (js2-ts-return js2-SHNE) + (js2-ts-return js2-NE)) + (throw 'return js2-NOT))) + (?< + ;; NB:treat HTML begin-comment as comment-till-eol + (when (js2-match-char ?!) + (when (js2-match-char ?-) + (when (js2-match-char ?-) + (js2-skip-line) + (setq js2-ts-comment-type 'html) + (throw 'return js2-COMMENT))) + (js2-unget-char)) + + (if (js2-match-char ?<) + (if (js2-match-char ?=) + (js2-ts-return js2-ASSIGN_LSH) + (js2-ts-return js2-LSH)) + (if (js2-match-char ?=) + (js2-ts-return js2-LE) + (throw 'return js2-LT)))) + (?> + (if (js2-match-char ?>) + (if (js2-match-char ?>) + (if (js2-match-char ?=) + (js2-ts-return js2-ASSIGN_URSH) + (js2-ts-return js2-URSH)) + (if (js2-match-char ?=) + (js2-ts-return js2-ASSIGN_RSH) + (js2-ts-return js2-RSH))) + (if (js2-match-char ?=) + (js2-ts-return js2-GE) + (throw 'return js2-GT)))) + (?* + (if (js2-match-char ?=) + (js2-ts-return js2-ASSIGN_MUL) + (throw 'return js2-MUL))) + + (?/ + ;; is it a // comment? + (when (js2-match-char ?/) + (setq js2-token-beg (- js2-ts-cursor 2)) + (js2-skip-line) + (setq js2-ts-comment-type 'line + js2-token-end js2-ts-cursor) + (throw 'return js2-COMMENT)) + + ;; is it a /* comment? + (when (js2-match-char ?*) + (setq look-for-slash nil + js2-token-beg (- js2-ts-cursor 2) + js2-ts-comment-type + (if (js2-match-char ?*) + (progn + (setq look-for-slash t) + 'jsdoc) + 'block)) + (while t + (setq c (js2-get-char)) + (cond + ((eq c js2-EOF_CHAR) + (setq js2-token-end (1- js2-ts-cursor)) + (js2-report-error "msg.unterminated.comment") + (throw 'return js2-COMMENT)) + ((eq c ?*) + (setq look-for-slash t)) + ((eq c ?/) + (if look-for-slash + (js2-ts-return js2-COMMENT))) + (t + (setq look-for-slash nil + js2-token-end js2-ts-cursor))))) + + (if (js2-match-char ?=) + (js2-ts-return js2-ASSIGN_DIV) + (throw 'return js2-DIV))) + + (?# + (when js2-skip-preprocessor-directives + (js2-skip-line) + (setq js2-ts-comment-type 'preprocessor + js2-token-end js2-ts-cursor) + (throw 'return js2-COMMENT)) + (throw 'return js2-ERROR)) + + (?% + (if (js2-match-char ?=) + (js2-ts-return js2-ASSIGN_MOD) + (throw 'return js2-MOD))) + (?~ + (throw 'return js2-BITNOT)) + (?+ + (if (js2-match-char ?=) + (js2-ts-return js2-ASSIGN_ADD) + (if (js2-match-char ?+) + (js2-ts-return js2-INC) + (throw 'return js2-ADD)))) + (?- + (cond + ((js2-match-char ?=) + (setq c js2-ASSIGN_SUB)) + ((js2-match-char ?-) + (unless js2-ts-dirty-line + ;; treat HTML end-comment after possible whitespace + ;; after line start as comment-until-eol + (when (js2-match-char ?>) + (js2-skip-line) + (setq js2-ts-comment-type 'html) + (throw 'return js2-COMMENT))) + (setq c js2-DEC)) + (t + (setq c js2-SUB))) + (setq js2-ts-dirty-line t) + (js2-ts-return c)) + + (otherwise + (js2-report-scan-error "msg.illegal.character"))))))) + +(defun js2-read-regexp (start-token) + "Called by parser when it gets / or /= in literal context." + (let (c + err + in-class + (continue t)) + (setq js2-token-beg js2-ts-cursor + js2-ts-string-buffer nil + js2-ts-regexp-flags nil) + + (if (eq start-token js2-ASSIGN_DIV) + ;; mis-scanned /= + (js2-add-to-string ?=) + (if (neq start-token js2-DIV) + (error "failed assertion"))) + + (while (and continue + (not err)) + (setq c (js2-get-char)) + (cond + ((or (eq c ?\n) + (eq c js2-EOF_CHAR)) + (setq js2-token-end (1- js2-ts-cursor) + err t + js2-ts-string (js2-collect-string js2-ts-string-buffer)) + (js2-report-error "msg.unterminated.re.lit")) + + ((= c ?\[) + (setq in-class t) + (js2-add-to-string c)) + + ((= c ?\]) + (setq in-class nil) + (js2-add-to-string c)) + + ((= c ?\\) + (js2-add-to-string c) + (setq c (js2-get-char))) + + ((= c ?/) + (if in-class + (js2-add-to-string c) + (setq continue nil))) + (t + (js2-add-to-string c)))) + + (unless err + (setq continue t) + (while continue + (cond + ((js2-match-char ?g) + (push ?g js2-ts-regexp-flags)) + ((js2-match-char ?i) + (push ?i js2-ts-regexp-flags)) + ((js2-match-char ?m) + (push ?m js2-ts-regexp-flags)) + (t + (setq continue nil)))) + (if (js2-alpha-p (js2-peek-char)) + (js2-report-scan-error "msg.invalid.re.flag" t)) + (setq js2-ts-string (js2-collect-string js2-ts-string-buffer) + js2-ts-regexp-flags (js2-collect-string js2-ts-regexp-flags) + js2-token-end js2-ts-cursor) + ;; tell `parse-partial-sexp' to ignore this range of chars + (put-text-property js2-token-beg js2-token-end 'syntax-class '(2))))) + +(defun js2-get-first-xml-token () + (setq js2-ts-xml-open-tags-count 0 + js2-ts-is-xml-attribute nil + js2-ts-xml-is-tag-content nil) + (js2-unget-char) + (js2-get-next-xml-token)) + +(defsubst js2-xml-discard-string () + "Throw away the string in progress and flag an XML parse error." + (setq js2-ts-string-buffer nil + js2-ts-string nil) + (js2-report-scan-error "msg.XML.bad.form" t)) + +(defun js2-get-next-xml-token () + (setq js2-ts-string-buffer nil ; for recording the XML + js2-token-beg js2-ts-cursor) + (loop for c = (js2-get-char) + while (/= c js2-EOF_CHAR) + do + (if js2-ts-xml-is-tag-content + (progn + (case c + (?> + (js2-add-to-string c) + (setq js2-ts-xml-is-tag-content nil + js2-ts-is-xml-attribute nil)) + (?/ + (js2-add-to-string c) + (when (eq ?> (js2-peek-char)) + (setq c (js2-get-char)) + (js2-add-to-string c) + (setq js2-ts-xml-is-tag-content nil) + (decf js2-ts-xml-open-tags-count))) + (?{ + (js2-unget-char) + (setq js2-ts-string (js2-get-string-from-buffer)) + (return js2-XML)) + ((?\' ?\") + (js2-add-to-string c) + (unless (js2-read-quoted-string c) + (return js2-ERROR))) + (?= + (js2-add-to-string c) + (setq js2-ts-is-xml-attribute t)) + ((? ?\t ?\r ?\n) + (js2-add-to-string c)) + (t + (js2-add-to-string c) + (setq js2-ts-is-xml-attribute nil))) + (when (and (not js2-ts-xml-is-tag-content) + (zerop js2-ts-xml-open-tags-count)) + (setq js2-ts-string (js2-get-string-from-buffer)) + (return js2-XMLEND))) + ;; else not tag content + (case c + (?< + (js2-add-to-string c) + (setq c (js2-peek-char)) + (case c + (?! + (setq c (js2-get-char)) ;; skip ! + (js2-add-to-string c) + (setq c (js2-peek-char)) + (case c + (?- + (setq c (js2-get-char)) ;; skip - + (js2-add-to-string c) + (if (eq c ?-) + (progn + (js2-add-to-string c) + (unless (js2-read-xml-comment) + (return js2-ERROR))) + (js2-xml-discard-string) + (return js2-ERROR))) + (?\[ + (setq c (js2-get-char)) ;; skip [ + (js2-add-to-string c) + (if (and (= (js2-get-char) ?C) + (= (js2-get-char) ?D) + (= (js2-get-char) ?A) + (= (js2-get-char) ?T) + (= (js2-get-char) ?A) + (= (js2-get-char) ?\[)) + (progn + (js2-add-to-string ?C) + (js2-add-to-string ?D) + (js2-add-to-string ?A) + (js2-add-to-string ?T) + (js2-add-to-string ?A) + (js2-add-to-string ?\[) + (unless (js2-read-cdata) + (return js2-ERROR))) + (js2-xml-discard-string) + (return js2-ERROR))) + (t + (unless (js2-read-entity) + (return js2-ERROR))))) + (?? + (setq c (js2-get-char)) ;; skip ? + (js2-add-to-string c) + (unless (js2-read-PI) + (return js2-ERROR))) + (?/ + ;; end tag + (setq c (js2-get-char)) ;; skip / + (js2-add-to-string c) + (when (zerop js2-ts-xml-open-tags-count) + (js2-xml-discard-string) + (return js2-ERROR)) + (setq js2-ts-xml-is-tag-content t) + (decf js2-ts-xml-open-tags-count)) + (t + ;; start tag + (setq js2-ts-xml-is-tag-content t) + (incf js2-ts-xml-open-tags-count)))) + (?{ + (js2-unget-char) + (setq js2-ts-string (js2-get-string-from-buffer)) + (return js2-XML)) + (t + (js2-add-to-string c)))) + finally ; seemingly not triggered? + (setq js2-token-end js2-ts-cursor))) ; doesn't affect return value + +(defun js2-read-quoted-string (quote) + (let (c) + (catch 'return + (while (/= (setq c (js2-get-char)) js2-EOF_CHAR) + (js2-add-to-string c) + (if (eq c quote) + (throw 'return t))) + (js2-xml-discard-string) ;; throw away string in progress + nil))) + +(defun js2-read-xml-comment () + (let ((c (js2-get-char))) + (catch 'return + (while (/= c js2-EOF_CHAR) + (catch 'continue + (js2-add-to-string c) + (when (and (eq c ?-) (eq ?- (js2-peek-char))) + (setq c (js2-get-char)) + (js2-add-to-string c) + (if (eq (js2-peek-char) ?>) + (progn + (setq c (js2-get-char)) ;; skip > + (js2-add-to-string c) + (throw 'return t)) + (throw 'continue nil))) + (setq c (js2-get-char)))) + (js2-xml-discard-string) + nil))) + +(defun js2-read-cdata () + (let ((c (js2-get-char))) + (catch 'return + (while (/= c js2-EOF_CHAR) + (catch 'continue + (js2-add-to-string c) + (when (and (eq c ?\]) (eq (js2-peek-char) ?\])) + (setq c (js2-get-char)) + (js2-add-to-string c) + (if (eq (js2-peek-char) ?>) + (progn + (setq c (js2-get-char)) ;; Skip > + (js2-add-to-string c) + (throw 'return t)) + (throw 'continue nil))) + (setq c (js2-get-char)))) + (js2-xml-discard-string) + nil))) + +(defun js2-read-entity () + (let ((decl-tags 1) + c) + (catch 'return + (while (/= js2-EOF_CHAR (setq c (js2-get-char))) + (js2-add-to-string c) + (case c + (?< + (incf decl-tags)) + (?> + (decf decl-tags) + (if (zerop decl-tags) + (throw 'return t))))) + (js2-xml-discard-string) + nil))) + +(defun js2-read-PI () + "Scan an XML processing instruction." + (let (c) + (catch 'return + (while (/= js2-EOF_CHAR (setq c (js2-get-char))) + (js2-add-to-string c) + (when (and (eq c ??) (eq (js2-peek-char) ?>)) + (setq c (js2-get-char)) ;; Skip > + (js2-add-to-string c) + (throw 'return t))) + (js2-xml-discard-string) + nil))) + +(defun js2-scanner-get-line () + "Return the text of the current scan line." + (buffer-substring (point-at-bol) (point-at-eol))) + +(provide 'js2-scan) + +;;; js2-scan.el ends here +;;; js2-messages: localizable messages for js2-mode + +;; Author: Steve Yegge (steve.yegge@gmail.com) +;; Keywords: javascript languages + +;;; Commentary: + +;; Messages are copied from Rhino's Messages.properties. +;; Many of the Java-specific messages have been elided. +;; Add any js2-specific ones at the end, so we can keep +;; this file synced with changes to Rhino's. +;; +;; TODO: +;; - move interpreter messages into separate file + +;;; Code: + +(defvar js2-message-table + (make-hash-table :test 'equal :size 250) + "Contains localized messages for js2-mode.") + +;; TODO: construct this hashtable at compile-time. +(defmacro js2-msg (key &rest strings) + `(puthash ,key (funcall #'concat ,@strings) + js2-message-table)) + +(defun js2-get-msg (msg-key) + "Look up a localized message. +MSG-KEY is a list of (MSG ARGS). If the message takes parameters, +the correct number of ARGS must be provided." + (let* ((key (if (listp msg-key) (car msg-key) msg-key)) + (args (if (listp msg-key) (cdr msg-key))) + (msg (gethash key js2-message-table))) + (if msg + (apply #'format msg args) + key))) ; default to showing the key + +(js2-msg "msg.dup.parms" + "Duplicate parameter name '%s'.") + +(js2-msg "msg.too.big.jump" + "Program too complex: jump offset too big.") + +(js2-msg "msg.too.big.index" + "Program too complex: internal index exceeds 64K limit.") + +(js2-msg "msg.while.compiling.fn" + "Encountered code generation error while compiling function '%s': %s") + +(js2-msg "msg.while.compiling.script" + "Encountered code generation error while compiling script: %s") + +;; Context +(js2-msg "msg.ctor.not.found" + "Constructor for '%s' not found.") + +(js2-msg "msg.not.ctor" + "'%s' is not a constructor.") + +;; FunctionObject +(js2-msg "msg.varargs.ctor" + "Method or constructor '%s' must be static " + "with the signature (Context cx, Object[] args, " + "Function ctorObj, boolean inNewExpr) " + "to define a variable arguments constructor.") + +(js2-msg "msg.varargs.fun" + "Method '%s' must be static with the signature " + "(Context cx, Scriptable thisObj, Object[] args, Function funObj) " + "to define a variable arguments function.") + +(js2-msg "msg.incompat.call" + "Method '%s' called on incompatible object.") + +(js2-msg "msg.bad.parms" + "Unsupported parameter type '%s' in method '%s'.") + +(js2-msg "msg.bad.method.return" + "Unsupported return type '%s' in method '%s'.") + +(js2-msg "msg.bad.ctor.return" + "Construction of objects of type '%s' is not supported.") + +(js2-msg "msg.no.overload" + "Method '%s' occurs multiple times in class '%s'.") + +(js2-msg "msg.method.not.found" + "Method '%s' not found in '%s'.") + +;; IRFactory + +(js2-msg "msg.bad.for.in.lhs" + "Invalid left-hand side of for..in loop.") + +(js2-msg "msg.mult.index" + "Only one variable allowed in for..in loop.") + +(js2-msg "msg.bad.for.in.destruct" + "Left hand side of for..in loop must be an array of " + "length 2 to accept key/value pair.") + +(js2-msg "msg.cant.convert" + "Can't convert to type '%s'.") + +(js2-msg "msg.bad.assign.left" + "Invalid assignment left-hand side.") + +(js2-msg "msg.bad.decr" + "Invalid decerement operand.") + +(js2-msg "msg.bad.incr" + "Invalid increment operand.") + +(js2-msg "msg.bad.yield" + "yield must be in a function.") + +(js2-msg "msg.yield.parenthesized" + "yield expression must be parenthesized.") + +;; NativeGlobal +(js2-msg "msg.cant.call.indirect" + "Function '%s' must be called directly, and not by way of a " + "function of another name.") + +(js2-msg "msg.eval.nonstring" + "Calling eval() with anything other than a primitive " + "string value will simply return the value. " + "Is this what you intended?") + +(js2-msg "msg.eval.nonstring.strict" + "Calling eval() with anything other than a primitive " + "string value is not allowed in strict mode.") + +(js2-msg "msg.bad.destruct.op" + "Invalid destructuring assignment operator") + +;; NativeCall +(js2-msg "msg.only.from.new" + "'%s' may only be invoked from a `new' expression.") + +(js2-msg "msg.deprec.ctor" + "The '%s' constructor is deprecated.") + +;; NativeFunction +(js2-msg "msg.no.function.ref.found" + "no source found to decompile function reference %s") + +(js2-msg "msg.arg.isnt.array" + "second argument to Function.prototype.apply must be an array") + +;; NativeGlobal +(js2-msg "msg.bad.esc.mask" + "invalid string escape mask") + +;; NativeRegExp +(js2-msg "msg.bad.quant" + "Invalid quantifier %s") + +(js2-msg "msg.overlarge.backref" + "Overly large back reference %s") + +(js2-msg "msg.overlarge.min" + "Overly large minimum %s") + +(js2-msg "msg.overlarge.max" + "Overly large maximum %s") + +(js2-msg "msg.zero.quant" + "Zero quantifier %s") + +(js2-msg "msg.max.lt.min" + "Maximum %s less than minimum") + +(js2-msg "msg.unterm.quant" + "Unterminated quantifier %s") + +(js2-msg "msg.unterm.paren" + "Unterminated parenthetical %s") + +(js2-msg "msg.unterm.class" + "Unterminated character class %s") + +(js2-msg "msg.bad.range" + "Invalid range in character class.") + +(js2-msg "msg.trail.backslash" + "Trailing \\ in regular expression.") + +(js2-msg "msg.re.unmatched.right.paren" + "unmatched ) in regular expression.") + +(js2-msg "msg.no.regexp" + "Regular expressions are not available.") + +(js2-msg "msg.bad.backref" + "back-reference exceeds number of capturing parentheses.") + +(js2-msg "msg.bad.regexp.compile" + "Only one argument may be specified if the first " + "argument to RegExp.prototype.compile is a RegExp object.") + +;; Parser +(js2-msg "msg.got.syntax.errors" + "Compilation produced %s syntax errors.") + +(js2-msg "msg.var.redecl" + "TypeError: redeclaration of var %s.") + +(js2-msg "msg.const.redecl" + "TypeError: redeclaration of const %s.") + +(js2-msg "msg.let.redecl" + "TypeError: redeclaration of variable %s.") + +(js2-msg "msg.parm.redecl" + "TypeError: redeclaration of formal parameter %s.") + +(js2-msg "msg.fn.redecl" + "TypeError: redeclaration of function %s.") + +;; NodeTransformer +(js2-msg "msg.dup.label" + "duplicated label") + +(js2-msg "msg.undef.label" + "undefined label") + +(js2-msg "msg.bad.break" + "unlabelled break must be inside loop or switch") + +(js2-msg "msg.continue.outside" + "continue must be inside loop") + +(js2-msg "msg.continue.nonloop" + "continue can only use labels of iteration statements") + +(js2-msg "msg.bad.throw.eol" + "Line terminator is not allowed between the throw " + "keyword and throw expression.") + +(js2-msg "msg.no.paren.parms" + "missing ( before function parameters.") + +(js2-msg "msg.no.parm" + "missing formal parameter") + +(js2-msg "msg.no.paren.after.parms" + "missing ) after formal parameters") + +(js2-msg "msg.no.brace.body" + "missing '{' before function body") + +(js2-msg "msg.no.brace.after.body" + "missing } after function body") + +(js2-msg "msg.no.paren.cond" + "missing ( before condition") + +(js2-msg "msg.no.paren.after.cond" + "missing ) after condition") + +(js2-msg "msg.no.semi.stmt" + "missing ; before statement") + +(js2-msg "msg.missing.semi" + "missing ; after statement") + +(js2-msg "msg.no.name.after.dot" + "missing name after . operator") + +(js2-msg "msg.no.name.after.coloncolon" + "missing name after :: operator") + +(js2-msg "msg.no.name.after.dotdot" + "missing name after .. operator") + +(js2-msg "msg.no.name.after.xmlAttr" + "missing name after .@") + +(js2-msg "msg.no.bracket.index" + "missing ] in index expression") + +(js2-msg "msg.no.paren.switch" + "missing ( before switch expression") + +(js2-msg "msg.no.paren.after.switch" + "missing ) after switch expression") + +(js2-msg "msg.no.brace.switch" + "missing '{' before switch body") + +(js2-msg "msg.bad.switch" + "invalid switch statement") + +(js2-msg "msg.no.colon.case" + "missing : after case expression") + +(js2-msg "msg.double.switch.default" + "double default label in the switch statement") + +(js2-msg "msg.no.while.do" + "missing while after do-loop body") + +(js2-msg "msg.no.paren.for" + "missing ( after for") + +(js2-msg "msg.no.semi.for" + "missing ; after for-loop initializer") + +(js2-msg "msg.no.semi.for.cond" + "missing ; after for-loop condition") + +(js2-msg "msg.in.after.for.name" + "missing in after for") + +(js2-msg "msg.no.paren.for.ctrl" + "missing ) after for-loop control") + +(js2-msg "msg.no.paren.with" + "missing ( before with-statement object") + +(js2-msg "msg.no.paren.after.with" + "missing ) after with-statement object") + +(js2-msg "msg.no.paren.after.let" + "missing ( after let") + +(js2-msg "msg.no.paren.let" + "missing ) after variable list") + +(js2-msg "msg.no.curly.let" + "missing } after let statement") + +(js2-msg "msg.bad.return" + "invalid return") + +(js2-msg "msg.no.brace.block" + "missing } in compound statement") + +(js2-msg "msg.bad.label" + "invalid label") + +(js2-msg "msg.bad.var" + "missing variable name") + +(js2-msg "msg.bad.var.init" + "invalid variable initialization") + +(js2-msg "msg.no.colon.cond" + "missing : in conditional expression") + +(js2-msg "msg.no.paren.arg" + "missing ) after argument list") + +(js2-msg "msg.no.bracket.arg" + "missing ] after element list") + +(js2-msg "msg.bad.prop" + "invalid property id") + +(js2-msg "msg.no.colon.prop" + "missing : after property id") + +(js2-msg "msg.no.brace.prop" + "missing } after property list") + +(js2-msg "msg.no.paren" + "missing ) in parenthetical") + +(js2-msg "msg.reserved.id" + "identifier is a reserved word") + +(js2-msg "msg.no.paren.catch" + "missing ( before catch-block condition") + +(js2-msg "msg.bad.catchcond" + "invalid catch block condition") + +(js2-msg "msg.catch.unreachable" + "any catch clauses following an unqualified catch are unreachable") + +(js2-msg "msg.no.brace.try" + "missing '{' before try block") + +(js2-msg "msg.no.brace.catchblock" + "missing '{' before catch-block body") + +(js2-msg "msg.try.no.catchfinally" + "'try' without 'catch' or 'finally'") + +(js2-msg "msg.no.return.value" + "function %s does not always return a value") + +(js2-msg "msg.anon.no.return.value" + "anonymous function does not always return a value") + +(js2-msg "msg.return.inconsistent" + "return statement is inconsistent with previous usage") + +(js2-msg "msg.generator.returns" + "TypeError: generator function '%s' returns a value") + +(js2-msg "msg.anon.generator.returns" + "TypeError: anonymous generator function returns a value") + +(js2-msg "msg.syntax" + "syntax error") + +(js2-msg "msg.unexpected.eof" + "Unexpected end of file") + +(js2-msg "msg.XML.bad.form" + "illegally formed XML syntax") + +(js2-msg "msg.XML.not.available" + "XML runtime not available") + +(js2-msg "msg.too.deep.parser.recursion" + "Too deep recursion while parsing") + +(js2-msg "msg.no.side.effects" + "Code has no side effects") + +(js2-msg "msg.extra.trailing.comma" + "Trailing comma is not legal in an ECMA-262 object initializer") + +(js2-msg "msg.array.trailing.comma" + "Trailing comma yields different behavior across browsers") + +(js2-msg "msg.equal.as.assign" + "Test for equality (==) mistyped as assignment (=)?") + +(js2-msg "msg.var.hides.arg" + "Variable %s hides argument") + +(js2-msg "msg.destruct.assign.no.init" + "Missing = in destructuring declaration") + +;; ScriptRuntime +(js2-msg "msg.no.properties" + "%s has no properties.") + +(js2-msg "msg.invalid.iterator" + "Invalid iterator value") + +(js2-msg "msg.iterator.primitive" + "__iterator__ returned a primitive value") + +(js2-msg "msg.assn.create.strict" + "Assignment to undeclared variable %s") + +(js2-msg "msg.ref.undefined.prop" + "Reference to undefined property '%s'") + +(js2-msg "msg.prop.not.found" + "Property %s not found.") + +(js2-msg "msg.invalid.type" + "Invalid JavaScript value of type %s") + +(js2-msg "msg.primitive.expected" + "Primitive type expected (had %s instead)") + +(js2-msg "msg.namespace.expected" + "Namespace object expected to left of :: (found %s instead)") + +(js2-msg "msg.null.to.object" + "Cannot convert null to an object.") + +(js2-msg "msg.undef.to.object" + "Cannot convert undefined to an object.") + +(js2-msg "msg.cyclic.value" + "Cyclic %s value not allowed.") + +(js2-msg "msg.is.not.defined" + "'%s' is not defined.") + +(js2-msg "msg.undef.prop.read" + "Cannot read property '%s' from %s") + +(js2-msg "msg.undef.prop.write" + "Cannot set property '%s' of %s to '%s'") + +(js2-msg "msg.undef.prop.delete" + "Cannot delete property '%s' of %s") + +(js2-msg "msg.undef.method.call" + "Cannot call method '%s' of %s") + +(js2-msg "msg.undef.with" + "Cannot apply 'with' to %s") + +(js2-msg "msg.isnt.function" + "%s is not a function, it is %s.") + +(js2-msg "msg.isnt.function.in" + "Cannot call property %s in object %s. " + "It is not a function, it is '%s'.") + +(js2-msg "msg.function.not.found" + "Cannot find function %s.") + +(js2-msg "msg.function.not.found.in" + "Cannot find function %s in object %s.") + +(js2-msg "msg.isnt.xml.object" + "%s is not an xml object.") + +(js2-msg "msg.no.ref.to.get" + "%s is not a reference to read reference value.") + +(js2-msg "msg.no.ref.to.set" + "%s is not a reference to set reference value to %s.") + +(js2-msg "msg.no.ref.from.function" + "Function %s can not be used as the left-hand " + "side of assignment or as an operand of ++ or -- operator.") + +(js2-msg "msg.bad.default.value" + "Object's getDefaultValue() method returned an object.") + +(js2-msg "msg.instanceof.not.object" + "Can't use instanceof on a non-object.") + +(js2-msg "msg.instanceof.bad.prototype" + "'prototype' property of %s is not an object.") + +(js2-msg "msg.bad.radix" + "illegal radix %s.") + +;; ScriptableObject +(js2-msg "msg.default.value" + "Cannot find default value for object.") + +(js2-msg "msg.zero.arg.ctor" + "Cannot load class '%s' which has no zero-parameter constructor.") + +(js2-msg "msg.ctor.multiple.parms" + "Can't define constructor or class %s since more than " + "one constructor has multiple parameters.") + +(js2-msg "msg.extend.scriptable" + "%s must extend ScriptableObject in order to define property %s.") + +(js2-msg "msg.bad.getter.parms" + "In order to define a property, getter %s must have zero " + "parameters or a single ScriptableObject parameter.") + +(js2-msg "msg.obj.getter.parms" + "Expected static or delegated getter %s to take " + "a ScriptableObject parameter.") + +(js2-msg "msg.getter.static" + "Getter and setter must both be static or neither be static.") + +(js2-msg "msg.setter.return" + "Setter must have void return type: %s") + +(js2-msg "msg.setter2.parms" + "Two-parameter setter must take a ScriptableObject as " + "its first parameter.") + +(js2-msg "msg.setter1.parms" + "Expected single parameter setter for %s") + +(js2-msg "msg.setter2.expected" + "Expected static or delegated setter %s to take two parameters.") + +(js2-msg "msg.setter.parms" + "Expected either one or two parameters for setter.") + +(js2-msg "msg.setter.bad.type" + "Unsupported parameter type '%s' in setter '%s'.") + +(js2-msg "msg.add.sealed" + "Cannot add a property to a sealed object: %s.") + +(js2-msg "msg.remove.sealed" + "Cannot remove a property from a sealed object: %s.") + +(js2-msg "msg.modify.sealed" + "Cannot modify a property of a sealed object: %s.") + +(js2-msg "msg.modify.readonly" + "Cannot modify readonly property: %s.") + +;; TokenStream +(js2-msg "msg.missing.exponent" + "missing exponent") + +(js2-msg "msg.caught.nfe" + "number format error") + +(js2-msg "msg.unterminated.string.lit" + "unterminated string literal") + +(js2-msg "msg.unterminated.comment" + "unterminated comment") + +(js2-msg "msg.unterminated.re.lit" + "unterminated regular expression literal") + +(js2-msg "msg.invalid.re.flag" + "invalid flag after regular expression") + +(js2-msg "msg.no.re.input.for" + "no input for %s") + +(js2-msg "msg.illegal.character" + "illegal character") + +(js2-msg "msg.invalid.escape" + "invalid Unicode escape sequence") + +(js2-msg "msg.bad.namespace" + "not a valid default namespace statement. " + "Syntax is: default xml namespace = EXPRESSION;") + +;; TokensStream warnings +(js2-msg "msg.bad.octal.literal" + "illegal octal literal digit %s; " + "interpreting it as a decimal digit") + +(js2-msg "msg.reserved.keyword" + "illegal usage of future reserved keyword %s; " + "interpreting it as ordinary identifier") + +(js2-msg "msg.script.is.not.constructor" + "Script objects are not constructors.") + +;; Arrays +(js2-msg "msg.arraylength.bad" + "Inappropriate array length.") + +;; Arrays +(js2-msg "msg.arraylength.too.big" + "Array length %s exceeds supported capacity limit.") + +;; URI +(js2-msg "msg.bad.uri" + "Malformed URI sequence.") + +;; Number +(js2-msg "msg.bad.precision" + "Precision %s out of range.") + +;; NativeGenerator +(js2-msg "msg.send.newborn" + "Attempt to send value to newborn generator") + +(js2-msg "msg.already.exec.gen" + "Already executing generator") + +(js2-msg "msg.StopIteration.invalid" + "StopIteration may not be changed to an arbitrary object.") + +;; Interpreter +(js2-msg "msg.yield.closing" + "Yield from closing generator") + +(provide 'js2-messages) +;;; js2-ast.el --- JavaScript syntax tree node definitions + +;; Author: Steve Yegge (steve.yegge@gmail.com) +;; Keywords: javascript languages + +;;; Code: + +(eval-and-compile + (require 'cl)) + + +;; flags for ast node property 'member-type (used for e4x operators) +(defvar js2-property-flag #x1 "property access: element is valid name") +(defvar js2-attribute-flag #x2 "x.@y or x..@y") +(defvar js2-descendants-flag #x4 "x..y or x..@i") + +(defsubst js2-relpos (pos anchor) + "Convert POS to be relative to ANCHOR. +If POS is nil, returns nil." + (and pos (- pos anchor))) + +(defsubst js2-make-pad (indent) + (if (zerop indent) + "" + (make-string (* indent js2-basic-offset) ? ))) + +(defsubst js2-visit-ast (node callback) + "Visit every node in ast NODE with visitor CALLBACK. + +CALLBACK is a function that takes two arguments: (NODE END-P). It is +called twice: once to visit the node, and again after all the node's +children have been processed. The END-P argument is nil on the first +call and non-nil on the second call. The return value of the callback +affects the traversal: if non-nil, the children of NODE are processed. +If the callback returns nil, or if the node has no children, then the +callback is called immediately with a non-nil END-P argument. + +The node traversal is approximately lexical-order, although there +are currently no guarantees around this." + (let ((vfunc (get (aref node 0) 'js2-visitor))) + ;; visit the node + (when (funcall callback node nil) + ;; visit the kids + (cond + ((eq vfunc 'js2-visit-none) + nil) ; don't even bother calling it + ;; Each AST node type has to define a `js2-visitor' function + ;; that takes a node and a callback, and calls `js2-visit-ast' + ;; on each child of the node. + (vfunc + (funcall vfunc node callback)) + (t + (error "%s does not define a visitor-traversal function" + (aref node 0))))) + ;; call the end-visit + (funcall callback node t))) + +(defstruct (js2-node + (:constructor nil)) ; abstract + "Base AST node type." + (type -1) ; token type + (pos -1) ; start position of this AST node in parsed input + (len 1) ; num characters spanned by the node + props ; optional node property list (an alist) + parent) ; link to parent node; null for root + +(defsubst js2-node-get-prop (node prop) + (assoc prop (js2-node-props node))) + +(defsubst js2-node-set-prop (node prop value) + (setf (js2-node-props node) + (cons (list prop value) (js2-node-props node)))) + +(defsubst js2-fixup-starts (n nodes) + "Adjust the start positions of NODES to be relative to N. +Any node in the list may be nil, for convenience." + (dolist (node nodes) + (when node + (setf (js2-node-pos node) (- (js2-node-pos node) + (js2-node-pos n)))))) + +(defsubst js2-node-add-children (parent &rest nodes) + "Set parent node of NODES to PARENT. +Does nothing if we're not recording parent links. +If any given node in NODES is nil, doesn't record that link." + (js2-fixup-starts parent nodes) + (dolist (node nodes) + (and node + (setf (js2-node-parent node) parent)))) + +;; Non-recursive since it's called a frightening number of times. +(defsubst js2-node-abs-pos (n) + (let ((pos (js2-node-pos n))) + (while (setq n (js2-node-parent n)) + (setq pos (+ pos (js2-node-pos n)))) + pos)) + +(defsubst js2-node-abs-end (n) + "Return absolute buffer position of end of N." + (+ (js2-node-abs-pos n) (js2-node-len n))) + +(defstruct (js2-stmt-node + (:include js2-node) + (:constructor nil)) ; abstract + "Abstract supertype of (most) statement nodes.") + +(defstruct (js2-expr-node + (:include js2-node) + (:constructor nil)) ; abstract + "Abstract supertype of (most) expression nodes.") + +(defstruct (js2-error-node + (:include js2-node) + (:constructor nil) ; silence emacs21 byte-compiler + (:constructor make-js2-error-node (&key (type js2-ERROR) + (pos js2-token-beg) + len))) + "AST node representing a parse error.") + +(put 'cl-struct-js2-error-node 'js2-visitor 'js2-visit-none) +(put 'cl-struct-js2-error-node 'js2-printer 'js2-print-none) + +;; It's important to make sure block nodes have a lisp list for the +;; child nodes, to limit printing recursion depth in an AST that +;; otherwise consists of defstruct vectors. Emacs will crash printing +;; a sufficiently large vector tree. + +(defstruct (js2-block-node + (:include js2-stmt-node) + (:constructor nil) + (:constructor make-js2-block-node (&key (type js2-BLOCK) + (pos js2-token-beg) + len + props + kids))) + "A block of statements." + scope ; a `js2-scope' + kids) ; a lisp list of the child statement nodes + +(put 'cl-struct-js2-block-node 'js2-visitor 'js2-visit-block) +(put 'cl-struct-js2-block-node 'js2-printer 'js2-print-block) + +(defsubst js2-visit-block (ast callback) + "Visit the `js2-block-node' children of AST." + (dolist (kid (js2-block-node-kids ast)) + (js2-visit-ast kid callback))) + +(defun js2-print-block (n i) + (let ((pad (js2-make-pad i))) + (insert pad "{\n") + (dolist (kid (js2-block-node-kids n)) + (js2-print-ast kid (1+ i))) + (insert pad "}"))) + +(defstruct (js2-script-node + (:include js2-block-node) + (:constructor nil) + (:constructor make-js2-script-node (&key (type js2-SCRIPT) + (pos js2-token-beg) + len + var-decls + fun-decls))) + functions ; lisp list of nested functions + regexps ; lisp list of (string . flags) + symbols ; alist (every symbol gets unique index) + (param-count 0) + var-names ; vector of string names + consts ; bool-vector matching var-decls + (temp-number 0)) ; for generating temp variables + +(put 'cl-struct-js2-script-node 'js2-visitor 'js2-visit-block) +(put 'cl-struct-js2-script-node 'js2-printer 'js2-print-script) + +(defun js2-print-script (node indent) + (dolist (kid (js2-block-node-kids node)) + (js2-print-ast kid indent))) + +(defstruct (js2-ast-root + (:include js2-script-node) + (:constructor nil) + (:constructor make-js2-ast-root (&key (type js2-SCRIPT) + (pos js2-token-beg) + len + buffer))) + "The root node of a js2 AST." + buffer ; the source buffer from which the code was parsed + comments ; a lisp list of comments, ordered by start position + errors ; a lisp list of errors found during parsing + warnings ; a lisp list of warnings found during parsing + node-count) ; number of nodes in the tree, including the root + +(put 'cl-struct-js2-ast-root 'js2-visitor 'js2-visit-ast-root) +(put 'cl-struct-js2-ast-root 'js2-printer 'js2-print-script) + +(defun js2-visit-ast-root (ast callback) + (dolist (kid (js2-ast-root-kids ast)) + (js2-visit-ast kid callback)) + (dolist (comment (js2-ast-root-comments ast)) + (js2-visit-ast comment callback))) + +(defstruct (js2-comment-node + (:include js2-node) + (:constructor nil) + (:constructor make-js2-comment-node (&key (type js2-COMMENT) + (pos js2-token-beg) + len + (format js2-ts-comment-type)))) + format) ; 'line, 'block, 'jsdoc or 'html + +(put 'cl-struct-js2-comment-node 'js2-visitor 'js2-visit-none) +(put 'cl-struct-js2-comment-node 'js2-printer 'js2-print-comment) + +(defun js2-print-comment (n i) + ;; We really ought to link end-of-line comments to their nodes. + ;; Or maybe we could add a new comment type, 'endline. + (insert (js2-make-pad i) + (js2-node-string n))) + +(defstruct (js2-expr-stmt-node + (:include js2-stmt-node) + (:constructor nil) + (:constructor make-js2-expr-stmt-node (&key (type js2-EXPR_RESULT) + (pos js2-ts-cursor) + len + expr))) + "An expression statement." + expr) + +(put 'cl-struct-js2-expr-stmt-node 'js2-visitor 'js2-visit-expr-stmt-node) +(put 'cl-struct-js2-expr-stmt-node 'js2-printer 'js2-print-expr-stmt-node) + +(defun js2-visit-expr-stmt-node (n v) + (js2-visit-ast (js2-expr-stmt-node-expr n) v)) + +(defun js2-print-expr-stmt-node (n indent) + (js2-print-ast (js2-expr-stmt-node-expr n) indent) + (insert ";\n")) + +(defstruct (js2-loop-node + (:include js2-stmt-node) + (:constructor nil)) + "Abstract supertype of loop nodes." + label ; optional `js2-labeled-stmt-node' + body ; a `js2-block-node' + scope ; a `js2-scope' + lp ; position of left-paren, nil if omitted + rp) ; position of right-paren, nil if omitted + +(defstruct (js2-do-node + (:include js2-loop-node) + (:constructor nil) + (:constructor make-js2-do-node (&key (type js2-DO) + (pos js2-token-beg) + len + label + body + condition + while-pos + lp + rp))) + "AST node for do-loop." + condition ; while (expression) + while-pos) ; buffer position of 'while' keyword + +(put 'cl-struct-js2-do-node 'js2-visitor 'js2-visit-do-node) +(put 'cl-struct-js2-do-node 'js2-printer 'js2-print-do-node) + +(defun js2-visit-do-node (n v) + (js2-visit-ast (js2-do-node-body n) v) + (js2-visit-ast (js2-do-node-condition n) v)) + +(defun js2-print-do-node (n i) + (let ((pad (js2-make-pad i))) + (insert pad "do {\n") + (dolist (kid (js2-block-node-kids (js2-do-node-body n))) + (js2-print-ast kid (1+ i))) + (insert pad "} while (") + (js2-print-ast (js2-do-node-condition n) 0) + (insert ");\n"))) + +(defstruct (js2-while-node + (:include js2-loop-node) + (:constructor nil) + (:constructor make-js2-while-node (&key (type js2-WHILE) + (pos js2-token-beg) + len + label + body + condition + lp + rp))) + "AST node for while-loop." + condition) ; while-condition + +(put 'cl-struct-js2-while-node 'js2-visitor 'js2-visit-while-node) +(put 'cl-struct-js2-while-node 'js2-printer 'js2-print-while-node) + +(defun js2-visit-while-node (n v) + (js2-visit-ast (js2-while-node-condition n) v) + (js2-visit-ast (js2-while-node-body n) v)) + +(defun js2-print-while-node (n i) + (let ((pad (js2-make-pad i))) + (insert pad "while (") + (js2-print-ast (js2-while-node-condition n) 0) + (insert ") {\n") + (js2-print-body (js2-while-node-body n) (1+ i)) + (insert pad "}\n"))) + +(defstruct (js2-for-node + (:include js2-loop-node) + (:constructor nil) + (:constructor make-js2-for-node (&key (type js2-FOR) + (pos js2-ts-cursor) + len + label + body + init + condition + update + lp + rp))) + "AST node for a C-style for-loop." + init ; initialization expression + condition ; loop condition + update) ; update clause + +(put 'cl-struct-js2-for-node 'js2-visitor 'js2-visit-for-node) +(put 'cl-struct-js2-for-node 'js2-printer 'js2-print-for-node) + +(defun js2-visit-for-node (n v) + (js2-visit-ast (js2-for-node-init n) v) + (js2-visit-ast (js2-for-node-condition n) v) + (js2-visit-ast (js2-for-node-update n) v) + (js2-visit-ast (js2-for-node-body n) v)) + +(defun js2-print-for-node (n i) + (let ((pad (js2-make-pad i))) + (insert pad "for (") + (js2-print-ast (js2-for-node-init n) 0) + (insert "; ") + (js2-print-ast (js2-for-node-condition n) 0) + (insert "; ") + (js2-print-ast (js2-for-node-update n) 0) + (insert ") {\n") + (js2-print-body (js2-for-node-body n) (1+ i)) + (insert pad "}\n"))) + +(defstruct (js2-for-in-node + (:include js2-loop-node) + (:constructor nil) + (:constructor make-js2-for-in-node (&key (type js2-FOR) + (pos js2-ts-cursor) + len + label + body + iterator + object + in-pos + each-pos + foreach-p + lp + rp))) + "AST node for a for..in loop." + iterator ; [var] foo in ... + object ; object over which we're iterating + in-pos ; buffer position of 'in' keyword + each-pos ; buffer position of 'each' keyword, if foreach-p + foreach-p) ; t if it's a for-each loop + +(put 'cl-struct-js2-for-in-node 'js2-visitor 'js2-visit-for-in-node) +(put 'cl-struct-js2-for-in-node 'js2-printer 'js2-print-for-in-node) + +(defun js2-visit-for-in-node (n v) + (js2-visit-ast (js2-for-in-node-iterator n) v) + (js2-visit-ast (js2-for-in-node-object n) v) + (js2-visit-ast (js2-for-in-node-body n) v)) + +(defun js2-print-for-in-node (n i) + (let ((pad (js2-make-pad i)) + (foreach (js2-for-in-node-foreach-p n))) + (insert pad "for ") + (if foreach + (insert "each ")) + (insert "(") + (js2-print-ast (js2-for-in-node-iterator n) 0) + (insert " in ") + (js2-print-ast (js2-for-in-node-object n) 0) + (insert ") {\n") + (js2-print-body (js2-for-in-node-body n) (1+ i)) + (insert pad "}\n"))) + +(defstruct (js2-return-node + (:include js2-stmt-node) + (:constructor nil) + (:constructor make-js2-return-node (&key (type js2-RETURN) + (pos js2-ts-cursor) + len + retval))) + "AST node for a return statement." + retval) ; expression to return, or 'undefined + +(put 'cl-struct-js2-return-node 'js2-visitor 'js2-visit-return-node) +(put 'cl-struct-js2-return-node 'js2-printer 'js2-print-return-node) + +(defun js2-visit-return-node (n v) + (if (js2-return-node-retval n) + (js2-visit-ast (js2-return-node-retval n) v))) + +(defun js2-print-return-node (n i) + (insert (js2-make-pad i) "return") + (when (js2-return-node-retval n) + (insert " ") + (js2-print-ast (js2-return-node-retval n) 0)) + (insert ";\n")) + +(defstruct (js2-if-node + (:include js2-stmt-node) + (:constructor nil) + (:constructor make-js2-if-node (&key (type js2-IF) + (pos js2-ts-cursor) + len + condition + then-part + else-pos + else-part + lp + rp))) + "AST node for an if-statement." + condition ; expression + then-part ; statement or block + else-pos ; optional buffer position of 'else' keyword + else-part ; optional statement or block + lp ; position of left-paren, nil if omitted + rp) ; position of right-paren, nil if omitted + +(put 'cl-struct-js2-if-node 'js2-visitor 'js2-visit-if-node) +(put 'cl-struct-js2-if-node 'js2-printer 'js2-print-if-node) + +(defun js2-visit-if-node (n v) + (js2-visit-ast (js2-if-node-condition n) v) + (js2-visit-ast (js2-if-node-then-part n) v) + (if (js2-if-node-else-part n) + (js2-visit-ast (js2-if-node-else-part n) v))) + +(defun js2-print-if-node (n i) + (let ((pad (js2-make-pad i)) + (then-part (js2-if-node-then-part n)) + (else-part (js2-if-node-else-part n))) + (insert pad "if (") + (js2-print-ast (js2-if-node-condition n) 0) + (insert ") {\n") + (js2-print-body then-part (1+ i)) + (insert pad "}") + (cond + ((not else-part) + (insert "\n")) + ((js2-if-node-p else-part) + (insert " else ") + (js2-print-body else-part i)) + (t + (insert " else {\n") + (js2-print-body else-part (1+ i)) + (insert pad "}\n"))))) + +(defstruct (js2-try-node + (:include js2-stmt-node) + (:constructor nil) + (:constructor make-js2-try-node (&key (type js2-TRY) + (pos js2-ts-cursor) + len + try-block + catch-clauses + finally-block))) + "AST node for a try-statement." + try-block + catch-clauses ; a lisp list of js2-catch-node + finally-block) ; a `js2-finally-node' + +(put 'cl-struct-js2-try-node 'js2-visitor 'js2-visit-try-node) +(put 'cl-struct-js2-try-node 'js2-printer 'js2-print-try-node) + +(defun js2-visit-try-node (n v) + (js2-visit-ast (js2-try-node-try-block n) v) + (dolist (clause (js2-try-node-catch-clauses n)) + (js2-visit-ast clause v)) + (if (js2-try-node-finally-block n) + (js2-visit-ast (js2-try-node-finally-block n) v))) + +(defun js2-print-try-node (n i) + (let ((pad (js2-make-pad i)) + (catches (js2-try-node-catch-clauses n)) + (finally (js2-try-node-finally-block n))) + (insert pad "try {\n") + (js2-print-body (js2-try-node-try-block n) (1+ i)) + (insert pad "}") + (when catches + (dolist (catch catches) + (js2-print-ast catch i))) + (if finally + (js2-print-ast finally i) + (insert "\n")))) + +(defstruct (js2-catch-node + (:include js2-stmt-node) + (:constructor nil) + (:constructor make-js2-catch-node (&key (type js2-CATCH) + (pos js2-ts-cursor) + len + var-name + guard-kwd + guard-expr + block + lp + rp))) + "AST node for a catch clause." + var-name ; a `js2-name-node' + guard-kwd ; relative buffer position of "if" in "catch (x if ...)" + guard-expr ; catch condition, a `js2-expr-node' + block ; statements, a `js2-block-node' + lp ; buffer position of left-paren, nil if omitted + rp) ; buffer position of right-paren, nil if omitted + +(put 'cl-struct-js2-catch-node 'js2-visitor 'js2-visit-catch-node) +(put 'cl-struct-js2-catch-node 'js2-printer 'js2-print-catch-node) + +(defun js2-visit-catch-node (n v) + (js2-visit-ast (js2-catch-node-var-name n) v) + (when (js2-catch-node-guard-kwd n) + (js2-visit-ast (js2-catch-node-guard-expr n) v)) + (js2-visit-ast (js2-catch-node-block n) v)) + +(defun js2-print-catch-node (n i) + (let ((pad (js2-make-pad i)) + (guard-kwd (js2-catch-node-guard-kwd n)) + (guard-expr (js2-catch-node-guard-expr n))) + (insert " catch (") + (js2-print-ast (js2-catch-node-var-name n) 0) + (when guard-kwd + (insert " if ") + (js2-print-ast guard-expr 0)) + (insert ") {\n") + (js2-print-body (js2-catch-node-block n) (1+ i)) + (insert pad "}"))) + +(defstruct (js2-finally-node + (:include js2-stmt-node) + (:constructor nil) + (:constructor make-js2-finally-node (&key (type js2-FINALLY) + (pos js2-ts-cursor) + len + block))) + "AST node for a finally clause." + block) + +(put 'cl-struct-js2-finally-node 'js2-visitor 'js2-visit-finally-node) +(put 'cl-struct-js2-finally-node 'js2-printer 'js2-print-finally-node) + +(defun js2-visit-finally-node (n v) + (js2-visit-ast (js2-finally-node-block n) v)) + +(defun js2-print-finally-node (n i) + (let ((pad (js2-make-pad i))) + (insert " finally {\n") + (js2-print-body (js2-finally-node-block n) (1+ i)) + (insert pad "}\n"))) + +(defstruct (js2-switch-node + (:include js2-stmt-node) + (:constructor nil) + (:constructor make-js2-switch-node (&key (type js2-SWITCH) + (pos js2-ts-cursor) + len + discriminant + cases + lp + rp))) + "AST node for a switch statement." + discriminant + cases ; a lisp list of `js2-case-node' + lp ; position of open-paren for discriminant, nil if omitted + rp) ; position of close-paren for discriminant, nil if omitted + +(put 'cl-struct-js2-switch-node 'js2-visitor 'js2-visit-switch-node) +(put 'cl-struct-js2-switch-node 'js2-printer 'js2-print-switch-node) + +(defun js2-visit-switch-node (n v) + (js2-visit-ast (js2-switch-node-discriminant n) v) + (dolist (c (js2-switch-node-cases n)) + (js2-visit-ast c v))) + +(defun js2-print-switch-node (n i) + (let ((pad (js2-make-pad i)) + (cases (js2-switch-node-cases n))) + (insert pad "switch (") + (js2-print-ast (js2-switch-node-discriminant n) 0) + (insert ") {\n") + (dolist (case cases) + (js2-print-ast case i)) + (insert pad "}\n"))) + +(defstruct (js2-case-node + (:include js2-block-node) + (:constructor nil) + (:constructor make-js2-case-node (&key (type js2-CASE) + (pos js2-ts-cursor) + len + kids + expr))) + "AST node for a case clause of a switch statement." + expr) ; the case expression (nil for default) + +(put 'cl-struct-js2-case-node 'js2-visitor 'js2-visit-case-node) +(put 'cl-struct-js2-case-node 'js2-printer 'js2-print-case-node) + +(defun js2-visit-case-node (n v) + (if (js2-case-node-expr n) ; nil for default: case + (js2-visit-ast (js2-case-node-expr n) v)) + (js2-visit-block n v)) + +(defun js2-print-case-node (n i) + (let ((pad (js2-make-pad i)) + (expr (js2-case-node-expr n))) + (insert pad) + (if (null expr) + (insert "default:\n") + (insert "case ") + (js2-print-ast expr 0) + (insert ":\n")) + (dolist (kid (js2-case-node-kids n)) + (js2-print-ast kid (1+ i))))) + +(defstruct (js2-throw-node + (:include js2-stmt-node) + (:constructor nil) + (:constructor make-js2-throw-node (&key (type js2-THROW) + (pos js2-ts-cursor) + len + expr))) + "AST node for a throw statement." + expr) ; the expression to throw + +(put 'cl-struct-js2-throw-node 'js2-visitor 'js2-visit-throw-node) +(put 'cl-struct-js2-throw-node 'js2-printer 'js2-print-throw-node) + +(defun js2-visit-throw-node (n v) + (js2-visit-ast (js2-throw-node-expr n) v)) + +(defun js2-print-throw-node (n i) + (insert (js2-make-pad i) "throw ") + (js2-print-ast (js2-throw-node-expr n) 0) + (insert ";\n")) + +(defstruct (js2-with-node + (:include js2-stmt-node) + (:constructor nil) + (:constructor make-js2-with-node (&key (type js2-WITH) + (pos js2-ts-cursor) + len + object + body + lp + rp))) + "AST node for a with-statement." + object + body + lp ; buffer position of left-paren around object, nil if omitted + rp) ; buffer position of right-paren around object, nil if omitted + +(put 'cl-struct-js2-with-node 'js2-visitor 'js2-visit-with-node) +(put 'cl-struct-js2-with-node 'js2-printer 'js2-print-with-node) + +(defun js2-visit-with-node (n v) + (js2-visit-ast (js2-with-node-object n) v) + (js2-visit-ast (js2-with-node-body n) v)) + +(defun js2-print-with-node (n i) + (let ((pad (js2-make-pad i))) + (insert pad "with (") + (js2-print-ast (js2-with-node-object n) 0) + (insert ") {\n") + (js2-print-body (js2-with-node-body n) (1+ i)) + (insert pad "}\n"))) + +(defstruct (js2-label-node + (:include js2-node) + (:constructor nil) + (:constructor make-js2-label-node (&key (type js2-LABEL) + (pos js2-ts-cursor) + len + label))) + "AST node for a statement label or case label." + label) ; a string + +(put 'cl-struct-js2-label-node 'js2-visitor 'js2-visit-none) +(put 'cl-struct-js2-label-node 'js2-printer 'js2-print-label) + +(defun js2-print-label (n i) + (insert (js2-make-pad i) + (js2-label-node-label n) + ":\n")) + +(defstruct (js2-labeled-stmt-node + (:include js2-stmt-node) + (:constructor nil) + ;; type needs to be in `js2-side-effecting-tokens' to avoid spurious + ;; no-side-effects warnings + (:constructor make-js2-labeled-stmt-node (&key (type js2-EXPR_RESULT) + (pos js2-ts-cursor) + len + labels + stmt))) + "AST node for a statement with one or more labels. +Multiple labels for a statement are collapsed into the labels field." + labels ; lisp list of `js2-label-node' + stmt) ; the statement these labels are for + +(put 'cl-struct-js2-labeled-stmt-node 'js2-visitor 'js2-visit-labeled-stmt) +(put 'cl-struct-js2-labeled-stmt-node 'js2-printer 'js2-print-labeled-stmt) + +(defun js2-visit-labeled-stmt (n v) + (dolist (label (js2-labeled-stmt-node-labels n)) + (js2-visit-ast label v)) + (js2-visit-ast (js2-labeled-stmt-node-stmt n) v)) + +(defun js2-print-labeled-stmt (n i) + (dolist (label (js2-labeled-stmt-node-labels n)) + (js2-print-ast label i)) + (js2-print-ast (js2-labeled-stmt-node-stmt n) (1+ i))) + +(defun js2-labeled-stmt-node-contains (node label) + "Return t if NODE contains LABEL in its label set. +NODE is a `js2-labels-node'. LABEL is an identifier." + (loop for nl in (js2-labeled-stmt-node-labels node) + if (string= label (js2-label-node-label nl)) + return t + finally return nil)) + +(defsubst js2-labeled-stmt-node-add-label (node label) + "Add a `js2-label-node' to the label set for this statement." + (setf (js2-labeled-stmt-node-labels node) + (nconc (js2-labeled-stmt-node-labels node) (list label)))) + +(defstruct (js2-jump-node + (:include js2-stmt-node) + (:constructor nil)) + "Abstract supertype of break and continue nodes." + label ; `js2-name-node' for location of label identifier, if present + target) ; target js2-labels-node or loop/switch statement + +(defun js2-visit-jump-node (n v) + ;; we don't visit the target, since it's a back-link + (if (js2-jump-node-label n) + (js2-visit-ast (js2-jump-node-label n) v))) + +(defstruct (js2-break-node + (:include js2-jump-node) + (:constructor nil) + (:constructor make-js2-break-node (&key (type js2-BREAK) + (pos js2-ts-cursor) + len + label + target))) + "AST node for a break statement. +The label field is a `js2-name-node', possibly nil, for the named label +if provided. E.g. in 'break foo', it represents 'foo'. The target field +is the target of the break - a label node or enclosing loop/switch statement.") + +(put 'cl-struct-js2-break-node 'js2-visitor 'js2-visit-jump-node) +(put 'cl-struct-js2-break-node 'js2-printer 'js2-print-break-node) + +(defun js2-print-break-node (n i) + (insert (js2-make-pad i) "break") + (when (js2-break-node-label n) + (insert " ") + (js2-print-ast (js2-break-node-label n) 0)) + (insert ";\n")) + +(defstruct (js2-continue-node + (:include js2-jump-node) + (:constructor nil) + (:constructor make-js2-continue-node (&key (type js2-CONTINUE) + (pos js2-ts-cursor) + len + label + target))) + "AST node for a continue statement. +The label field is the user-supplied enclosing label name, a `js2-name-node'. +It is nil if continue specifies no label. The target field is the jump target: +a `js2-label-node' or the innermost enclosing loop.") + +(put 'cl-struct-js2-continue-node 'js2-visitor 'js2-visit-jump-node) +(put 'cl-struct-js2-continue-node 'js2-printer 'js2-print-continue-node) + +(defun js2-print-continue-node (n i) + (insert (js2-make-pad i) "continue") + (when (js2-continue-node-label n) + (insert " ") + (js2-print-ast (js2-continue-node-label n) 0)) + (insert ";\n")) + +(defstruct (js2-function-node + (:include js2-script-node) + (:constructor nil) + (:constructor make-js2-function-node (&key (type js2-FUNCTION) + (pos js2-ts-cursor) + len + (ftype 'FUNCTION) + (form 'STATEMENT_FORM) + (name "") + params + body + lp + rp))) + "AST node for a function declaration. +The `params' field is a lisp list of nodes. Each node is either a simple +`js2-name-node', or if it's a destructuring-assignment parameter, a +`js2-array-node' or `js2-object-node'." + ftype ; FUNCTION, GETTER or SETTER + form ; DECLARED_FORM, STATEMENT_FORM or EXPRESSED_FORM + name ; function name (a `js2-name-node', or nil if anonymous) + params ; a lisp list of `js2-function-arg-node' + body ; a `js2-block-node' + lp ; position of arg-list open-paren, or nil if omitted + rp ; position of arg-list close-paren, or nil if omitted + needs-activation ; t if we need an activation object for this frame + is-generator) ; t if this function contains a yield + +(put 'cl-struct-js2-function-node 'js2-visitor 'js2-visit-function-node) +(put 'cl-struct-js2-function-node 'js2-printer 'js2-print-function-node) + +(defun js2-visit-function-node (n v) + (if (js2-function-node-name n) + (js2-visit-ast (js2-function-node-name n) v)) + (dolist (p (js2-function-node-params n)) + (js2-visit-ast p v)) + (js2-visit-ast (js2-function-node-body n) v)) + +(defun js2-print-function-node (n i) + (let ((pad (js2-make-pad i)) + (getter (js2-node-get-prop n 'GETTER_SETTER)) + (name (js2-function-node-name n)) + (params (js2-function-node-params n)) + (body (js2-function-node-body n)) + (expr (eq (js2-function-node-form n) 'FUNCTION_EXPRESSION))) + (unless getter + (insert pad "function")) + (when name + (insert " ") + (js2-print-ast name 0)) + (insert "(") + (loop with len = (length params) + for param in params + for count from 1 + do + (js2-print-ast param 0) + (if (< count len) + (insert ", "))) + (insert ") {") + (unless expr + (insert "\n")) + ;; TODO: fix this to be smarter about indenting, etc. + (js2-print-body body (1+ i)) + (insert pad "}") + (unless expr + (insert "\n")))) + +(defsubst js2-function-name (node) + "Return function name for NODE, a `js2-function-node', or nil if anonymous." + (and (js2-function-node-name node) + (js2-name-node-name (js2-function-node-name node)))) + +(defstruct (js2-function-arg-node + (:include js2-expr-node) + (:constructor nil) + (:constructor make-js2-function-arg-node (&key (type js2-NAME) + (pos js2-token-beg) + len + value))) + "AST node for a function formal parameter. +The value field is either an array/object literal or a name node." + value) + +(put 'cl-struct-js2-function-arg-node 'js2-visitor 'js2-visit-function-arg-node) +(put 'cl-struct-js2-function-arg-node 'js2-printer 'js2-print-function-arg-node) + +(defun js2-visit-function-arg-node (n v) + (js2-visit-ast (js2-function-arg-node-value n) v)) + +(defun js2-print-function-arg-node (n i) + (js2-print-ast (js2-function-arg-node-value n) i)) + +;; Having this be an expression node makes it more flexible. +;; There are IDE contexts, such as indentation in a for-loop initializer, +;; that work better if you assume it's an expression. Whenever we have +;; a standalone var/const declaration, we just wrap with an expr stmt. +;; Eclipse apparently screwed this up and now has two versions, expr and stmt. +(defstruct (js2-var-decl-node + (:include js2-expr-node) + (:constructor nil) + (:constructor make-js2-var-decl-node (&key (type js2-VAR) + (pos js2-token-beg) + len + kids + decl-type))) + "AST node for a variable declaration list (VAR, CONST or LET). +The node bounds differ depending on the declaration type. For VAR or +CONST declarations, the bounds include the var/const keyword. For LET +declarations, the node begins at the position of the first child." + kids ; a lisp list of `js2-var-init-node' structs. + decl-type) ; js2-VAR, js2-CONST or js2-LET + +(put 'cl-struct-js2-var-decl-node 'js2-visitor 'js2-visit-var-decl) +(put 'cl-struct-js2-var-decl-node 'js2-printer 'js2-print-var-decl) + +(defun js2-visit-var-decl (n v) + (dolist (kid (js2-var-decl-node-kids n)) + (js2-visit-ast kid v))) + +(defun js2-print-var-decl (n i) + (let ((pad (js2-make-pad i)) + (tt (js2-var-decl-node-decl-type n))) + (insert pad) + (insert (cond + ((= tt js2-VAR) "var ") + ((= tt js2-LET) "") ; handled by parent let-{expr/stmt} + ((= tt js2-CONST) "const ") + (t + (error "malformed var-decl node")))) + (loop with kids = (js2-var-decl-node-kids n) + with len = (length kids) + for kid in kids + for count from 1 + do + (js2-print-ast kid 0) + (if (< count len) + (insert ", "))))) + +(defstruct (js2-var-init-node + (:include js2-expr-node) + (:constructor nil) + (:constructor make-js2-var-init-node (&key (type js2-VAR) + (pos js2-ts-cursor) + len + name + initializer))) + "AST node for a variable declaration. +The type field will be js2-CONST for a const decl." + name ; foo (a `js2-name-node') + initializer) ; = bar * baz (a `js2-expr-node') + +(put 'cl-struct-js2-var-init-node 'js2-visitor 'js2-visit-var-init-node) +(put 'cl-struct-js2-var-init-node 'js2-printer 'js2-print-var-init-node) + +(defun js2-visit-var-init-node (n v) + (js2-visit-ast (js2-var-init-node-name n) v) + (if (js2-var-init-node-initializer n) + (js2-visit-ast (js2-var-init-node-initializer n) v))) + +(defun js2-print-var-init-node (n i) + (let ((pad (js2-make-pad i)) + (name (js2-var-init-node-name n)) + (init (js2-var-init-node-initializer n))) + (insert pad) + (js2-print-ast name 0) + (when init + (insert " = ") + (js2-print-ast init 0)))) + +(defstruct (js2-destructuring-init-node + (:include js2-var-init-node) + (:constructor nil) + (:constructor make-js2-destructuring-init-node (&key (type js2-VAR) + (pos js2-ts-cursor) + len + lhs + initializer))) + "AST node for a destructuring-assignment expression. +It will likely have a `js2-var-decl-node' as its direct parent. +The lhs field is an array literal or object literal node, and the initializer +is the expression that will be destructured." + lhs) ; a `js2-expr-node' (array literal or obj literal) + +(put 'cl-struct-js2-destructuring-init-node 'js2-visitor 'js2-visit-destructuring-init) +(put 'cl-struct-js2-destructuring-init-node 'js2-printer 'js2-print-destructuring-init) + +(defun js2-visit-destructuring-init (n v) + (js2-visit-ast (js2-destructuring-init-node-lhs n) v) + (if (js2-destructuring-init-node-initializer n) ; not present in for..in loops + (js2-visit-ast (js2-destructuring-init-node-initializer n) v))) + +(defun js2-print-destructuring-init (n i) + (insert (js2-make-pad i)) + (js2-print-ast (js2-destructuring-init-node-lhs n) 0) + (when (js2-destructuring-init-node-initializer n) + (insert " = ") + (js2-print-ast (js2-destructuring-init-node-initializer n) 0))) + +(defstruct (js2-cond-node + (:include js2-expr-node) + (:constructor nil) + (:constructor make-js2-cond-node (&key (type js2-HOOK) + (pos js2-ts-cursor) + len + test-expr + true-expr + false-expr + q-pos + c-pos))) + "AST node for the ternary operator" + test-expr + true-expr + false-expr + q-pos ; buffer position of ? + c-pos) ; buffer position of : + +(put 'cl-struct-js2-cond-node 'js2-visitor 'js2-visit-cond-node) +(put 'cl-struct-js2-cond-node 'js2-printer 'js2-print-cond-node) + +(defun js2-visit-cond-node (n v) + (js2-visit-ast (js2-cond-node-test-expr n) v) + (js2-visit-ast (js2-cond-node-true-expr n) v) + (js2-visit-ast (js2-cond-node-false-expr n) v)) + +(defun js2-print-cond-node (n i) + (let ((pad (js2-make-pad i))) + (insert pad) + (js2-print-ast (js2-cond-node-test-expr n) 0) + (insert " ? ") + (js2-print-ast (js2-cond-node-true-expr n) 0) + (insert " : ") + (js2-print-ast (js2-cond-node-false-expr n) 0))) + +(defstruct (js2-infix-node + (:include js2-expr-node) + (:constructor nil) + (:constructor make-js2-infix-node (&key type + (pos js2-ts-cursor) + len + op-pos + left + right))) + "Abstract base type for infix expressions. +Includes assignment ops like `|=', and the comma operator. +The type field inherited from `js2-node' holds the operator." + op-pos ; buffer position where operator begins + left ; a `js2-expr-node' + right) ; a `js2-expr-node' or `js2-function-node' + +(put 'cl-struct-js2-infix-node 'js2-visitor 'js2-visit-infix-node) +(put 'cl-struct-js2-infix-node 'js2-printer 'js2-print-infix-node) + +(defun js2-visit-infix-node (n v) + (js2-visit-ast (js2-infix-node-left n) v) + (js2-visit-ast (js2-infix-node-right n) v)) + +(defconst js2-operator-tokens + (let ((table (make-hash-table :test 'eq)) + (tokens + (list (cons js2-IN "in") + (cons js2-TYPEOF "typeof") + (cons js2-INSTANCEOF "instanceof") + (cons js2-DELPROP "delete") + (cons js2-COMMA ",") + (cons js2-COLON ":") + (cons js2-OR "||") + (cons js2-AND "&&") + (cons js2-INC "++") + (cons js2-DEC "--") + (cons js2-BITOR "|") + (cons js2-BITXOR "^") + (cons js2-BITAND "&") + (cons js2-EQ "==") + (cons js2-NE "!=") + (cons js2-LT "<") + (cons js2-LE "<=") + (cons js2-GT ">") + (cons js2-GE ">=") + (cons js2-LSH "<<") + (cons js2-RSH ">>") + (cons js2-URSH ">>>") + (cons js2-ADD "+") ; infix plus + (cons js2-SUB "-") ; infix minus + (cons js2-MUL "*") + (cons js2-DIV "/") + (cons js2-MOD "%") + (cons js2-NOT "!") + (cons js2-BITNOT "~") + (cons js2-POS "+") ; unary plus + (cons js2-NEG "-") ; unary minus + (cons js2-SHEQ "===") ; shallow equality + (cons js2-SHNE "!==") ; shallow inequality + (cons js2-ASSIGN "=") + (cons js2-ASSIGN_BITOR "|=") + (cons js2-ASSIGN_BITXOR "^=") + (cons js2-ASSIGN_BITAND "&=") + (cons js2-ASSIGN_LSH "<<=") + (cons js2-ASSIGN_RSH ">>=") + (cons js2-ASSIGN_URSH ">>>=") + (cons js2-ASSIGN_ADD "+=") + (cons js2-ASSIGN_SUB "-=") + (cons js2-ASSIGN_MUL "*=") + (cons js2-ASSIGN_DIV "/=") + (cons js2-ASSIGN_MOD "%=")))) + (loop for (k . v) in tokens do + (puthash k v table)) + table)) + +(defun js2-print-infix-node (n i) + (let* ((tt (js2-node-type n)) + (op (gethash tt js2-operator-tokens))) + (unless op + (error "unrecognized infix operator %s" (js2-node-type n))) + (insert (js2-make-pad i)) + (js2-print-ast (js2-infix-node-left n) 0) + (unless (= tt js2-COMMA) + (insert " ")) + (insert op) + (insert " ") + (js2-print-ast (js2-infix-node-right n) 0))) + +(defstruct (js2-in-node + (:include js2-infix-node) + (:constructor nil) + (:constructor make-js2-in-node (&key (type js2-IN) + (pos js2-ts-cursor) + len + op-pos + left + right))) + "AST node for an in-expression such as `foo in bar'") + +(put 'cl-struct-js2-in-node 'js2-visitor 'js2-visit-infix-node) +(put 'cl-struct-js2-in-node 'js2-printer 'js2-print-infix-node) + +(defstruct (js2-assign-node + (:include js2-infix-node) + (:constructor nil) + (:constructor make-js2-assign-node (&key type + (pos js2-ts-cursor) + len + op-pos + left + right))) + "Represents any assignment. +The type field holds the actual assignment operator.") + +(put 'cl-struct-js2-assign-node 'js2-visitor 'js2-visit-infix-node) +(put 'cl-struct-js2-assign-node 'js2-printer 'js2-print-infix-node) + +(defstruct (js2-unary-node + (:include js2-expr-node) + (:constructor nil) + (:constructor make-js2-unary-node (&key type ; required + (pos js2-ts-cursor) + len + operand))) + "AST node type for unary operator nodes. +The type field can be NOT, BITNOT, POS, NEG, INC, DEC, +TYPEOF, or DELPROP. For INC or DEC, a 'postfix node +property is added if the operator follows the operand." + operand) ; a `js2-expr-node' + +(put 'cl-struct-js2-unary-node 'js2-visitor 'js2-visit-unary-node) +(put 'cl-struct-js2-unary-node 'js2-printer 'js2-print-unary-node) + +(defun js2-visit-unary-node (n v) + (js2-visit-ast (js2-unary-node-operand n) v)) + +(defun js2-print-unary-node (n i) + (let* ((tt (js2-node-type n)) + (op (gethash tt js2-operator-tokens)) + (postfix (js2-node-get-prop n 'postfix))) + (unless op + (error "unrecognized unary operator %s" tt)) + (insert (js2-make-pad i)) + (unless postfix + (insert op)) + (if (or (= tt js2-TYPEOF) + (= tt js2-DELPROP)) + (insert " ")) + (js2-print-ast (js2-unary-node-operand n) 0) + (when postfix + (insert op)))) + +(defstruct (js2-let-expr-node + (:include js2-expr-node) + (:constructor nil) + (:constructor make-js2-let-expr-node (&key (type js2-LETEXPR) + (pos js2-token-beg) + len + vars + expr + lp + rp))) + "AST node for a let expression such as let (i=6) i+2." + vars + expr ; a `js2-expr-node' + scope ; a `js2-scope' + lp + rp) + +(put 'cl-struct-js2-let-expr-node 'js2-visitor 'js2-visit-let-expr-node) +(put 'cl-struct-js2-let-expr-node 'js2-printer 'js2-print-let-expr-node) + +(defun js2-visit-let-expr-node (n v) + (js2-visit-ast (js2-let-expr-node-vars n) v) + (if (js2-let-expr-node-expr n) + (js2-visit-ast (js2-let-expr-node-expr n) v))) + +(defun js2-print-let-expr-node (n i) + (let ((expr (js2-let-expr-node-expr n))) + (insert (js2-make-pad i) "let ") + (if expr + (insert "(")) + (js2-print-ast (js2-let-expr-node-vars n) 0) + (when expr + (insert ") ") + (js2-print-ast expr 0)))) + +(defstruct (js2-let-stmt-node + (:include js2-stmt-node) + (:constructor nil) + (:constructor make-js2-let-stmt-node (&key (type js2-LET) + (pos js2-token-beg) + len + vars + body + lp + rp))) + "AST node for a let statement such as let (i=6) {x += i}." + vars + body ; a statement node + scope ; a `js2-scope' + lp ; position of left-paren, nil if omitted + rp) ; position of right-paren, nil if omitted + +(put 'cl-struct-js2-let-stmt-node 'js2-visitor 'js2-visit-let-stmt-node) +(put 'cl-struct-js2-let-stmt-node 'js2-printer 'js2-print-let-stmt-node) + +(defun js2-visit-let-stmt-node (n v) + (let ((body (js2-let-stmt-node-body n))) + (js2-visit-ast (js2-let-stmt-node-vars n) v) + (when body + (js2-visit-ast body v)))) + +(defun js2-print-let-stmt-node (n i) + (let ((pad (js2-make-pad i)) + body (js2-let-stmt-node-body)) + (insert pad "let ") + (if body + (insert "(")) + (js2-print-ast (js2-let-stmt-node-vars n) 0) + (if (not body) + (insert ";\n") + (insert ") {\n") + (js2-print-body (js2-let-stmt-node-body n) (1+ i)) + (insert pad "}\n")))) + +;; `defstruct' doesn't provide multiple inheritance for fields, alas. +(defsubst js2-let-node-p (node) + "Interface predicate for let-stmt and let-expr nodes." + (or (js2-let-expr-node-p node) + (js2-let-stmt-node-p node))) + +(defsubst js2-let-node-lp (node) + (if (js2-let-expr-node-p node) + (js2-let-expr-node-lp node) + (js2-let-stmt-node-lp node))) + +(defsubst js2-let-node-rp (node) + (if (js2-let-expr-node-p node) + (js2-let-expr-node-rp node) + (js2-let-stmt-node-rp node))) + +(defstruct (js2-debugger-node + (:include js2-stmt-node) + (:constructor nil) + (:constructor make-js2-debugger-node (&key (type js2-DEBUGGER) + (pos js2-token-beg) + (len (- js2-ts-cursor pos))))) + "AST node for debugger statement.") + +(put 'cl-struct-js2-debugger-node 'js2-visitor 'js2-visit-none) +(put 'cl-struct-js2-debugger-node 'js2-printer 'js2-print-debugger) + +(defun js2-print-debugger (n i) + (insert (js2-make-pad i) "debugger;\n")) + +(defstruct (js2-new-node + (:include js2-expr-node) + (:constructor nil) + (:constructor make-js2-new-node (&key (type js2-NEW) + (pos js2-token-beg) + len + target + args + initializer + lp + rp))) + "AST node for new-expression such as new Foo()." + target ; an identifier or reference + args ; a lisp list of argument nodes + lp ; position of left-paren, nil if omitted + rp ; position of right-paren, nil if omitted + initializer) ; experimental Rhino syntax: optional `js2-object-node' + +(put 'cl-struct-js2-new-node 'js2-visitor 'js2-visit-new-node) +(put 'cl-struct-js2-new-node 'js2-printer 'js2-print-new-node) + +(defun js2-visit-new-node (n v) + (js2-visit-ast (js2-new-node-target n) v) + (dolist (arg (js2-new-node-args n)) + (js2-visit-ast arg v)) + (when (js2-new-node-initializer n) + (js2-visit-ast (js2-new-node-initializer n) v))) + +(defun js2-print-new-node (n i) + (insert (js2-make-pad i) "new ") + (js2-print-ast (js2-new-node-target n)) + (insert "(") + (js2-print-list (js2-new-node-args n)) + (insert ")") + (when (js2-new-node-initializer n) + (insert " ") + (js2-print-ast (js2-new-node-initializer n)))) + +(defstruct (js2-name-node + (:include js2-expr-node) + (:constructor nil) + (:constructor make-js2-name-node (&key (type js2-NAME) + (pos js2-token-beg) + (len (- js2-ts-cursor + js2-token-beg)) + (name js2-ts-string)))) + "AST node for a JavaScript identifier" + name) ; a string + +(put 'cl-struct-js2-name-node 'js2-visitor 'js2-visit-none) +(put 'cl-struct-js2-name-node 'js2-printer 'js2-print-name) + +(defun js2-print-name (n i) + (insert (js2-make-pad i) + (js2-name-node-name n))) + +(defstruct (js2-number-node + (:include js2-expr-node) + (:constructor nil) + (:constructor make-js2-number-node (&key (type js2-NUMBER) + (pos js2-token-beg) + (len (- js2-ts-cursor + js2-token-beg)) + (value js2-ts-string) + (num-value js2-ts-number)))) + "AST node for a number literal." + value ; the original string, e.g. "6.02e23" + num-value) ; the parsed number value + +(put 'cl-struct-js2-number-node 'js2-visitor 'js2-visit-none) +(put 'cl-struct-js2-number-node 'js2-printer 'js2-print-number-node) + +(defun js2-print-number-node (n i) + (insert (js2-make-pad i) + (number-to-string (js2-number-node-value n)))) + +(defstruct (js2-regexp-node + (:include js2-expr-node) + (:constructor nil) + (:constructor make-js2-regexp-node (&key (type js2-REGEXP) + (pos js2-token-beg) + (len (- js2-ts-cursor + js2-token-beg)) + value + flags))) + "AST node for a regular expression literal." + value ; the regexp string, without // delimiters + flags) ; a string of flags, e.g. `mi'. + +(put 'cl-struct-js2-regexp-node 'js2-visitor 'js2-visit-none) +(put 'cl-struct-js2-regexp-node 'js2-printer 'js2-print-regexp) + +(defun js2-print-regexp (n i) + (insert (js2-make-pad i) + "/" + (js2-regexp-node-value n) + "/") + (if (js2-regexp-node-flags n) + (insert (js2-regexp-node-flags n)))) + +(defstruct (js2-string-node + (:include js2-expr-node) + (:constructor nil) + (:constructor make-js2-string-node (&key (type js2-STRING) + (pos js2-token-beg) + (len (- js2-ts-cursor + js2-token-beg)) + (value js2-ts-string)))) + "String literal. +Escape characters are not evaluated; e.g. \n is 2 chars in value field. +You can tell the quote type by looking at the first character." + value) ; the characters of the string, including the quotes + +(put 'cl-struct-js2-string-node 'js2-visitor 'js2-visit-none) +(put 'cl-struct-js2-string-node 'js2-printer 'js2-print-string) + +(defun js2-print-string (n i) + (insert (js2-make-pad i) + (js2-node-string n))) + +(defstruct (js2-array-node + (:include js2-expr-node) + (:constructor nil) + (:constructor make-js2-array-node (&key (type js2-ARRAYLIT) + (pos js2-ts-cursor) + len + elems))) + "AST node for an array literal." + elems) ; list of expressions. [foo,,bar] yields a nil middle element. + +(put 'cl-struct-js2-array-node 'js2-visitor 'js2-visit-array-node) +(put 'cl-struct-js2-array-node 'js2-printer 'js2-print-array-node) + +(defun js2-visit-array-node (n v) + (dolist (e (js2-array-node-elems n)) + (when e ; can be nil, e.g. [a, ,b] + (js2-visit-ast e v)))) + +(defun js2-print-array-node (n i) + (insert (js2-make-pad i) "[") + (js2-print-list (js2-array-node-elems n)) + (insert "]")) + +(defstruct (js2-object-node + (:include js2-expr-node) + (:constructor nil) + (:constructor make-js2-object-node (&key (type js2-OBJECTLIT) + (pos js2-ts-cursor) + len + elems))) + "AST node for an object literal expression." + elems) ; a lisp list of `js2-object-prop-node' + +(put 'cl-struct-js2-object-node 'js2-visitor 'js2-visit-object-node) +(put 'cl-struct-js2-object-node 'js2-printer 'js2-print-object-node) + +(defun js2-visit-object-node (n v) + (dolist (e (js2-object-node-elems n)) + (js2-visit-ast e v))) + +(defun js2-print-object-node (n i) + (insert (js2-make-pad i) "{") + (js2-print-list (js2-object-node-elems n)) + (insert "}")) + +(defstruct (js2-object-prop-node + (:include js2-infix-node) + (:constructor nil) + (:constructor make-js2-object-prop-node (&key (type js2-COLON) + (pos js2-ts-cursor) + len + left + right + op-pos))) + "AST node for an object literal prop:value entry. +The `left' field is the property: a name node, string node or number node. +The `right' field is a `js2-expr-node' representing the initializer value.") + +(put 'cl-struct-js2-object-prop-node 'js2-visitor 'js2-visit-infix-node) +(put 'cl-struct-js2-object-prop-node 'js2-printer 'js2-print-object-prop-node) + +(defun js2-print-object-prop-node (n i) + (insert (js2-make-pad i)) + (js2-print-ast (js2-object-prop-node-left n) 0) + (insert ":") + (js2-print-ast (js2-object-prop-node-right n) 0)) + +(defstruct (js2-getter-setter-node + (:include js2-infix-node) + (:constructor nil) + (:constructor make-js2-getter-setter-node (&key type ; GET or SET + (pos js2-ts-cursor) + len + left + right + kwd))) + "AST node for a getter/setter property in an object literal. +The `left' field is the `js2-name-node' naming the getter/setter prop. +The `right' field is always an anonymous `js2-function-node' with a node +property `GETTER_SETTER' set to js2-GET or js2-SET. " + kwd) ; a `js2-string-node' representing the keyword + +(put 'cl-struct-js2-getter-setter-node 'js2-visitor 'js2-visit-infix-node) +(put 'cl-struct-js2-getter-setter-node 'js2-printer 'js2-print-getter-setter) + +(defun js2-print-getter-setter (n i) + (let ((pad (js2-make-pad i)) + (kwd (js2-getter-setter-node-kwd n)) + (left (js2-getter-setter-node-left n)) + (right (js2-getter-setter-node-right n))) + (insert pad (js2-string-node-value kwd) " ") + (js2-print-ast left 0) + (js2-print-ast right 0))) + +(defstruct (js2-prop-get-node + (:include js2-expr-node) + (:constructor nil) + (:constructor make-js2-prop-get-node (&key (type js2-GETPROP) + (pos js2-ts-cursor) + len + target + prop))) + "AST node for a dotted property reference, e.g. foo.bar or foo().bar" + target ; foo (can be any expression) + prop) ; bar (a `js2-name-node') + +(put 'cl-struct-js2-prop-get-node 'js2-visitor 'js2-visit-prop-get-node) +(put 'cl-struct-js2-prop-get-node 'js2-printer 'js2-print-prop-get-node) + +(defun js2-visit-prop-get-node (n v) + (js2-visit-ast (js2-prop-get-node-target n) v) + (js2-visit-ast (js2-prop-get-node-prop n) v)) + +(defun js2-print-prop-get-node (n i) + (insert (js2-make-pad i)) + (js2-print-ast (js2-prop-get-node-target n) 0) + (insert ".") + (js2-print-ast (js2-prop-get-node-prop n) 0)) + +(defstruct (js2-elem-get-node + (:include js2-prop-get-node) + (:constructor nil) + (:constructor make-js2-elem-get-node (&key (type js2-GETELEM) + (pos js2-ts-cursor) + len + target + prop + lb + rb))) + "AST node for an array index expression such as foo[bar]." + lb ; position of left-bracket, nil if omitted + rb) ; position of right-bracket, nil if omitted + +(put 'cl-struct-js2-elem-get-node 'js2-visitor 'js2-visit-elem-get-node) +(put 'cl-struct-js2-elem-get-node 'js2-printer 'js2-print-elem-get-node) + +(defun js2-visit-elem-get-node (n v) + (js2-visit-ast (js2-elem-get-node-target n) v) + (js2-visit-ast (js2-elem-get-node-prop n) v)) + +(defun js2-print-elem-get-node (n i) + (insert (js2-make-pad i)) + (js2-print-ast (js2-elem-get-node-target n) 0) + (insert "[") + (js2-print-ast (js2-elem-get-node-prop n) 0) + (insert "]")) + +(defstruct (js2-call-node + (:include js2-expr-node) + (:constructor nil) + (:constructor make-js2-call-node (&key (type js2-CALL) + (pos js2-ts-cursor) + len + expr + args + lp + rp))) + "AST node for a JavaScript function call." + expr ; a `js2-expr-node' evaluating to the function to call + args ; a lisp list of argument AST nodes + lp ; position of open-paren, or nil if missing + rp) ; position of close-paren, or nil if missing + +(put 'cl-struct-js2-call-node 'js2-visitor 'js2-visit-call-node) +(put 'cl-struct-js2-call-node 'js2-printer 'js2-print-call-node) + +(defun js2-visit-call-node (n v) + (js2-visit-ast (js2-call-node-expr n) v) + (dolist (arg (js2-call-node-args n)) + (js2-visit-ast arg v))) + +(defun js2-print-call-node (n i) + (insert (js2-make-pad i)) + (js2-print-ast (js2-call-node-expr n) 0) + (insert "(") + (js2-print-list (js2-call-node-args n)) + (insert ")")) + +(defstruct (js2-literal-node + (:include js2-expr-node) + (:constructor nil) + (:constructor make-js2-literal-node (&key type ; required + (pos js2-token-beg) + (len (- js2-ts-cursor + js2-token-beg))))) + "AST node representing a literal value such as `null'. +Used for `null', `this', `true' and `false'. +The node type is set to js2-NULL, js2-THIS, etc.") + +(put 'cl-struct-js2-literal-node 'js2-visitor 'js2-visit-none) +(put 'cl-struct-js2-literal-node 'js2-printer 'js2-print-literal-node) + +(defsubst js2-this-node-p (node) + "Return t if this node is a `js2-literal-node' of type js2-THIS." + (eq (js2-node-type node) js2-THIS)) + +(defun js2-print-literal-node (n i) + (insert (js2-make-pad i)) + (insert + (let ((type (js2-node-type n))) + (cond + ((= type js2-NULL) "null") + ((= type js2-VOID) "void") + ((= type js2-THIS) "this") + ((= type js2-TRUE) "true") + ((= type js2-FALSE) "false") + (t + (error "Unknown literal value %s" type)))))) + +;; This can be an expr or statment, unfortunately. +(defstruct (js2-yield-node + (:include js2-node) + (:constructor nil) + (:constructor make-js2-yield-node (&key (type js2-YIELD) + (pos js2-ts-cursor) + len + value))) + "AST node for yield statement." + value) ; value to be yielded + +(put 'cl-struct-js2-yield-node 'js2-visitor 'js2-visit-yield-node) +(put 'cl-struct-js2-yield-node 'js2-printer 'js2-print-yield-node) + +(defun js2-visit-yield-node (n v) + (js2-visit-ast (js2-yield-node-value n) v)) + +(defun js2-print-yield-node (n i) + (insert (js2-make-pad i)) + (insert "yield") + (when (js2-yield-node-value n) + (insert " ") + (js2-print-ast (js2-yield-node-value n) 0))) + +(defstruct (js2-paren-node + (:include js2-expr-node) + (:constructor nil) + (:constructor make-js2-paren-node (&key (type js2-LP) + (pos js2-ts-cursor) + len + expr))) + "AST node for a parenthesized expression. +In particular, used when the parens are syntactically optional, +as opposed to required parens such as those enclosing an if-conditional." + expr) ; `js2-expr-node' + +(put 'cl-struct-js2-paren-node 'js2-visitor 'js2-visit-paren-node) +(put 'cl-struct-js2-paren-node 'js2-printer 'js2-print-paren-node) + +(defun js2-visit-paren-node (n v) + (js2-visit-ast (js2-paren-node-expr n) v)) + +(defun js2-print-paren-node (n i) + (insert (js2-make-pad i)) + (insert "(") + (js2-print-ast (js2-paren-node-expr n) 0) + (insert ")")) + +(defstruct (js2-array-comp-node + (:include js2-expr-node) + (:constructor nil) + (:constructor make-js2-array-comp-node (&key (type js2-ARRAYCOMP) + (pos js2-ts-cursor) + len + result + loops + filter + if-pos + lp + rp))) + "AST node for an Array comprehension such as [[x,y] for (x in foo) for (y in bar)]." + result ; result expression (just after left-bracket) + loops ; a lisp list of `js2-array-comp-loop-node' + filter ; guard/filter expression + if-pos ; buffer pos of 'if' keyword, if present, else nil + lp ; buffer position of if-guard left-paren, or nil if not present + rp) ; buffer position of if-guard right-paren, or nil if not present + +(put 'cl-struct-js2-array-comp-node 'js2-visitor 'js2-visit-array-comp-node) +(put 'cl-struct-js2-array-comp-node 'js2-printer 'js2-print-array-comp-node) + +(defun js2-visit-array-comp-node (n v) + (js2-visit-ast (js2-array-comp-node-result n) v) + (dolist (l (js2-array-comp-node-loops n)) + (js2-visit-ast l v)) + (if (js2-array-comp-node-filter n) + (js2-visit-ast (js2-array-comp-node-filter n) v))) + +(defun js2-print-array-comp-node (n i) + (let ((pad (js2-make-pad i)) + (result (js2-array-comp-node-result n)) + (loops (js2-array-comp-node-loops n)) + (filter (js2-array-comp-node-filter n))) + (insert pad "[") + (js2-print-ast result 0) + (dolist (l loops) + (insert " ") + (js2-print-ast l 0)) + (when filter + (insert " if (") + (js2-print-ast filter 0)) + (insert ")]"))) + +(defstruct (js2-array-comp-loop-node + (:include js2-for-in-node) + (:constructor nil) + (:constructor make-js2-array-comp-loop-node (&key (type js2-FOR) + (pos js2-ts-cursor) + len + iterator + object + in-pos + foreach-p + each-pos + lp + rp))) + "AST subtree for each 'for (foo in bar)' loop in an array comprehension.") + +(put 'cl-struct-js2-array-comp-loop-node 'js2-visitor 'js2-visit-array-comp-loop) +(put 'cl-struct-js2-array-comp-loop-node 'js2-printer 'js2-print-array-comp-loop) + +(defun js2-visit-array-comp-loop (n v) + (js2-visit-ast (js2-array-comp-loop-node-iterator n) v) + (js2-visit-ast (js2-array-comp-loop-node-object n) v)) + +(defun js2-print-array-comp-loop (n i) + (insert "for (") + (js2-print-ast (js2-array-comp-loop-node-iterator n) 0) + (insert " in ") + (js2-print-ast (js2-array-comp-loop-node-object n) 0) + (insert ")")) + +(defstruct (js2-empty-stmt-node + (:include js2-stmt-node) + (:constructor nil) + (:constructor make-js2-empty-stmt-node (&key (type js2-EMPTY) + (pos js2-token-beg) + len))) + "AST node for an empty statement.") + +(put 'cl-struct-js2-empty-stmt-node 'js2-visitor 'js2-visit-none) +(put 'cl-struct-js2-empty-stmt-node 'js2-printer 'js2-print-none) + +(defstruct (js2-empty-expr-node + (:include js2-expr-node) + (:constructor nil) + (:constructor make-js2-empty-expr-node (&key (type js2-EMPTY) + (pos js2-token-beg) + len))) + "AST node for an empty expression.") + +(put 'cl-struct-js2-empty-expr-node 'js2-visitor 'js2-visit-none) +(put 'cl-struct-js2-empty-expr-node 'js2-printer 'js2-print-none) + +(defstruct (js2-xml-node + (:include js2-block-node) + (:constructor nil) + (:constructor make-js2-xml-node (&key (type js2-XML) + (pos js2-token-beg) + len + kids))) + "AST node for initial parse of E4X literals. +The kids field is a list of XML fragments: strings and js exprs. +Rhino just creates a concatenation of them (binary plus) and passes +the concatenation to the constructor of a new XML object.") + +(put 'cl-struct-js2-xml-node 'js2-visitor 'js2-visit-block) +(put 'cl-struct-js2-xml-node 'js2-printer 'js2-print-xml-node) + +(defun js2-print-xml-node (n i) + (dolist (kid (js2-xml-node-kids n)) + (js2-print-ast kid i))) + +(defstruct (js2-xml-start-tag-node + (:include js2-xml-node) + (:constructor nil) + (:constructor make-js2-xml-start-tag-node (&key (type js2-XML) + (pos js2-ts-cursor) + len + name + attrs + kids + empty-p))) + "AST node for an XML start-tag. +The `kids' field is a lisp list of child content nodes." + name ; a `js2-xml-name-node' + attrs ; a lisp list of `js2-xml-attr-node' + empty-p) ; t if this is an empty element such as + +(put 'cl-struct-js2-xml-start-tag-node 'js2-visitor 'js2-visit-xml-start-tag) +(put 'cl-struct-js2-xml-start-tag-node 'js2-printer 'js2-print-xml-start-tag) + +(defun js2-visit-xml-start-tag (n v) + (js2-visit-ast (js2-xml-start-tag-node-name n) v) + (dolist (attr (js2-xml-start-tag-node-attrs n)) + (js2-visit-ast attr v)) + (js2-visit-block n v)) + +(defun js2-print-xml-start-tag (n i) + (insert (js2-make-pad i) "<") + (js2-print-ast (js2-xml-start-tag-node-name n) 0) + (when (js2-xml-start-tag-node-attrs n) + (insert " ") + (js2-print-list (js2-xml-start-tag-node-attrs n) " ")) + (insert ">")) + +;; I -think- I'm going to make the parent node the corresponding start-tag, +;; and add the end-tag to the kids list of the parent as well. +(defstruct (js2-xml-end-tag-node + (:include js2-xml-node) + (:constructor nil) + (:constructor make-js2-xml-end-tag-node (&key (type js2-XML) + (pos js2-ts-cursor) + len + name))) + "AST node for an XML end-tag." + name) ; a `js2-xml-name-node' + +(put 'cl-struct-js2-xml-end-tag-node 'js2-visitor 'js2-visit-xml-end-tag) +(put 'cl-struct-js2-xml-end-tag-node 'js2-printer 'js2-print-xml-end-tag) + +(defun js2-visit-xml-end-tag (n v) + (js2-visit-ast (js2-xml-end-tag-node-name n) v)) + +(defun js2-print-xml-end-tag (n i) + (insert (js2-make-pad i)) + (insert "")) + +(defstruct (js2-xml-name-node + (:include js2-xml-node) + (:constructor nil) + (:constructor make-js2-xml-name-node (&key (type js2-XML) + (pos js2-ts-cursor) + len + namespace + kids))) + "AST node for an E4X XML name. +Any XML name can be qualified with a namespace, hence the namespace field. +Further, any E4X name can be comprised of arbitrary JavaScript {} expressions. +The kids field is a list of `js2-name-node' and `js2-xml-js-expr-node'. +For a simple name, the kids list has exactly one node, a `js2-name-node'." + namespace) ; a `js2-string-node' + +(put 'cl-struct-js2-xml-name-node 'js2-visitor 'js2-visit-xml-name-node) +(put 'cl-struct-js2-xml-name-node 'js2-printer 'js2-print-xml-name-node) + +(defun js2-visit-xml-name-node (n v) + (js2-visit-ast (js2-xml-name-node-namespace n) v)) + +(defun js2-print-xml-name-node (n i) + (insert (js2-make-pad i)) + (when (js2-xml-name-node-namespace n) + (js2-print-ast (js2-xml-name-node-namespace n) 0) + (insert "::")) + (dolist (kid (js2-xml-name-node-kids n)) + (js2-print-ast kid 0))) + +(defstruct (js2-xml-pi-node + (:include js2-xml-node) + (:constructor nil) + (:constructor make-js2-xml-pi-node (&key (type js2-XML) + (pos js2-ts-cursor) + len + name + attrs))) + "AST node for an E4X XML processing instruction." + name ; a `js2-xml-name-node' + attrs) ; a list of `js2-xml-attr-node' + +(put 'cl-struct-js2-xml-pi-node 'js2-visitor 'js2-visit-xml-pi-node) +(put 'cl-struct-js2-xml-pi-node 'js2-printer 'js2-print-xml-pi-node) + +(defun js2-visit-xml-pi-node (n v) + (js2-visit-ast (js2-xml-pi-node-name n) v) + (dolist (attr (js2-xml-pi-node-attrs n)) + (js2-visit-ast attr v))) + +(defun js2-print-xml-pi-node (n i) + (insert (js2-make-pad i) "")) + +(defstruct (js2-xml-cdata-node + (:include js2-xml-node) + (:constructor nil) + (:constructor make-js2-xml-cdata-node (&key (type js2-XML) + (pos js2-ts-cursor) + len + content))) + "AST node for a CDATA escape section." + content) ; a `js2-string-node' with node-property 'quote-type 'cdata + +(put 'cl-struct-js2-xml-cdata-node 'js2-visitor 'js2-visit-xml-cdata-node) +(put 'cl-struct-js2-xml-cdata-node 'js2-printer 'js2-print-xml-cdata-node) + +(defun js2-visit-xml-cdata-node (n v) + (js2-visit-ast (js2-xml-cdata-node-content n) v)) + +(defun js2-print-xml-cdata-node (n i) + (insert (js2-make-pad i)) + (js2-print-ast (js2-xml-cdata-node-content n))) + +(defstruct (js2-xml-js-expr-node + (:include js2-xml-node) + (:constructor nil) + (:constructor make-js2-xml-js-expr-node (&key (type js2-XML) + (pos js2-ts-cursor) + len + expr))) + "AST node for an embedded JavaScript {expression} in an E4X literal. +The start and end fields correspond to the curly-braces." + expr) ; a `js2-expr-node' of some sort + +(put 'cl-struct-js2-xml-js-expr-node 'js2-visitor 'js2-visit-xml-js-expr) +(put 'cl-struct-js2-xml-js-expr-node 'js2-printer 'js2-print-xml-js-expr) + +(defun js2-visit-xml-js-expr (n v) + (js2-visit-ast (js2-xml-js-expr-node-expr n) v)) + +(defun js2-print-xml-js-expr (n i) + (insert (js2-make-pad i)) + (insert "{") + (js2-print-ast (js2-xml-js-expr-node-expr n) 0) + (insert "}")) + +(defstruct (js2-xml-attr-node + (:include js2-xml-node) + (:constructor nil) + (:constructor make-js2-attr-node (&key (type js2-XML) + (pos js2-ts-cursor) + len + name + value + eq-pos + quote-type))) + "AST node representing a foo='bar' XML attribute value." + name ; a `js2-xml-name-node' + value ; a `js2-xml-name-node' + eq-pos ; buffer position of "=" sign + quote-type) ; 'single or 'double + +(put 'cl-struct-js2-xml-attr-node 'js2-visitor 'js2-visit-xml-attr-node) +(put 'cl-struct-js2-xml-attr-node 'js2-printer 'js2-print-xml-attr-node) + +(defun js2-visit-xml-attr-node (n v) + (js2-visit-ast (js2-xml-attr-node-name n) v) + (js2-visit-ast (js2-xml-attr-node-value n) v)) + +(defun js2-print-xml-attr-node (n i) + (let ((quote (if (eq (js2-xml-attr-node-quote-type n) 'single) + "'" + "\""))) + (insert (js2-make-pad i)) + (js2-print-ast (js2-xml-attr-node-name n) 0) + (insert "=" quote) + (js2-print-ast (js2-xml-attr-node-value n) 0) + (insert quote))) + +(defstruct (js2-xml-text-node + (:include js2-xml-node) + (:constructor nil) + (:constructor make-js2-text-node (&key (type js2-XML) + (pos js2-ts-cursor) + len + content))) + "AST node for an E4X XML text node." + content) ; a lisp list of `js2-string-node' and `js2-xml-js-expr-node' + +(put 'cl-struct-js2-xml-text-node 'js2-visitor 'js2-visit-xml-text-node) +(put 'cl-struct-js2-xml-text-node 'js2-printer 'js2-print-xml-text-node) + +(defun js2-visit-xml-text-node (n v) + (js2-visit-ast (js2-xml-text-node-content n) v)) + +(defun js2-print-xml-text-node (n i) + (insert (js2-make-pad i)) + (dolist (kid (js2-xml-text-node-content n)) + (js2-print-ast kid))) + +;; Should this be a `js2-comment-node' instead? +(defstruct (js2-xml-comment-node + (:include js2-xml-node) + (:constructor nil) + (:constructor make-js2-xml-comment-node (&key (type js2-XML) + (pos js2-ts-cursor) + len))) + "AST node for E4X XML comment.") + +(put 'cl-struct-js2-xml-comment-node 'js2-visitor 'js2-visit-none) +(put 'cl-struct-js2-xml-comment-node 'js2-printer 'js2-print-xml-comment) + +(defun js2-print-xml-comment (n i) + (insert (js2-make-pad i) + (js2-node-string n))) + +(defstruct (js2-xml-dot-query-node + (:include js2-infix-node) + (:constructor nil) + (:constructor make-js2-xml-dot-query-node (&key (type js2-DOTQUERY) + (pos js2-ts-cursor) + op-pos + len + left + right))) + "AST node for an E4X foo.(bar) filter expression.") + +(put 'cl-struct-js2-xml-dot-query-node 'js2-visitor 'js2-visit-infix-node) +(put 'cl-struct-js2-xml-dot-query-node 'js2-printer 'js2-print-xml-dot-query) + +(defun js2-print-xml-dot-query (n i) + (insert (js2-make-pad i)) + (js2-print-ast (js2-xml-dot-query-node-left n) 0) + (insert ".(") + (js2-print-ast (js2-xml-dot-query-node-right n) 0) + (insert ")")) + +(defstruct (js2-xml-ref-node + (:include js2-expr-node) + (:constructor nil) + (:constructor make-js2-xml-ref-node (&key (type js2-REF_NAME) + (pos js2-ts-cursor) + op-pos + len + target + namespace + propname + ref-expr + flags))) + "AST node for a simple E4X XML attribute or member expression. +This can take a variety of forms: + name, ns::name, *::name, ns::*, *::* + @attr, @*, @ns::attr, @ns::*, @*::attr, @*::* + @[expr], @ns::[expr], @*::[expr] +Not all the fields will be set for any given format. +This node type will be the child of a '.' or '..' operator. +The target field is the expression preceding the operator. +The flags field specifies whether it's an attribute access, and +also whether it was a .. (descendants) operator." + target ; `js2-expr-node' + namespace ; a `js2-string-node' representing a prop name or "*" + propname ; a `js2-string-node' representing a prop name or "*" + ref-expr ; if [expr], a `js2-expr-node' for the expression + flags ; member type flags (mostly for runtime execution) + op-pos) ; position of the start of the operator + +(put 'cl-struct-js2-xml-ref-node 'js2-visitor 'js2-visit-xml-ref-node) +(put 'cl-struct-js2-xml-ref-node 'js2-printer 'js2-print-xml-ref-node) + +(defun js2-visit-xml-ref-node (n v) + (if (js2-xml-ref-node-target n) + (js2-visit-ast (js2-xml-ref-node-target n) v)) + (if (js2-xml-ref-node-namespace n) + (js2-visit-ast (js2-xml-ref-node-namespace n) v)) + (if (js2-xml-ref-node-propname n) + (js2-visit-ast (js2-xml-ref-node-propname n) v)) + (if (js2-xml-ref-node-ref-expr n) + (js2-visit-ast (js2-xml-ref-node-ref-expr n) v))) + +(defun js2-print-xml-ref-node (n i) + (insert (js2-make-pad i)) + (js2-print-ast (js2-xml-ref-node-target n) 0) + (insert (if (flag-set-p (js2-xml-ref-node-flags n) + js2-descendants-flag) + ".." + ",")) + (when (js2-xml-ref-node-namespace n) + (js2-print-ast (js2-xml-ref-node-namespace n) 0) + (insert "::")) + (if (js2-xml-ref-node-propname n) + (js2-print-ast (js2-xml-ref-node-propname n) 0) + (insert "[") + (js2-print-ast (js2-xml-ref-node-ref-expr n) 0) + (insert "]"))) + +(defsubst js2-node-line (n) + "Fetch the source line number at the start of node N. +This is O(n) in the length of the source buffer; use prudently." + (1+ (count-lines (point-min) (js2-node-abs-pos n)))) + +(defsubst js2-block-node-kid (n i) + "Return child I of node N, or nil if there aren't that many." + (nth i (js2-block-node-kids n))) + +(defsubst js2-block-node-first (n) + "Return first child of block node N, or nil if there is none." + (first (js2-block-node-kids n))) + +(defun js2-node-root (n) + "Return the root of the AST containing N. +If N has no parent pointer, returns N." + (let ((parent (js2-node-parent n))) + (if parent + (js2-node-root parent) + n))) + +(defun js2-node-parent-stmt (node) + "Return the node's first ancestor that is a statement. +Returns nil if NODE is a `js2-ast-root'." + (let ((parent (js2-node-parent node))) + (if (or (null parent) + (js2-stmt-node-p parent) + (and (js2-function-node-p parent) + (neq (js2-function-node-form parent) 'FUNCTION_EXPRESSION))) + parent + (js2-node-parent-stmt parent)))) + +(defun js2-node-position-in-parent (node &optional parent) + "Return the position of NODE in parent's block-kids list. +PARENT can be supplied if known. Positioned returned is zero-indexed. +Returns 0 if NODE is not a child of a block statement, or if NODE +is not a statement node." + (let ((p (or parent (js2-node-parent node))) + (i 0)) + (if (not (js2-block-node-p p)) + i + (or (js2-position node (js2-block-node-kids p)) + 0)))) + +(defsubst js2-node-short-name (n) + "Return the short name of node N as a string, e.g. `js2-if-node'." + (substring (symbol-name (aref n 0)) + (length "cl-struct-"))) + +(defsubst js2-node-child-list (node) + "Return the child list for NODE, a lisp list of nodes. +Works for block nodes, array nodes, obj literals, funarg lists, +var decls and try nodes (for catch clauses). Note that you should call +`js2-block-node-kids' on the function body for the body statements. +Returns nil for zero-length child lists or unsupported nodes." + (cond + ((js2-function-node-p node) + (js2-function-node-params node)) + ((js2-block-node-p node) + (js2-block-node-kids node)) + ((js2-try-node-p node) + (js2-try-node-catch-clauses node)) + ((js2-array-node-p node) + (js2-array-node-elems node)) + ((js2-object-node-p node) + (js2-object-node-elems node)) + ((js2-call-node-p node) + (js2-call-node-args node)) + ((js2-new-node-p node) + (js2-new-node-args node)) + ((js2-var-decl-node-p node) + (js2-var-decl-node-kids node)) + (t + nil))) + +(defsubst js2-node-set-child-list (node kids) + "Set the child list for NODE to KIDS." + (cond + ((js2-function-node-p node) + (setf (js2-function-node-params node) kids)) + ((js2-block-node-p node) + (setf (js2-block-node-kids node) kids)) + ((js2-try-node-p node) + (setf (js2-try-node-catch-clauses node) kids)) + ((js2-array-node-p node) + (setf (js2-array-node-elems node) kids)) + ((js2-object-node-p node) + (setf (js2-object-node-elems node) kids)) + ((js2-call-node-p node) + (setf (js2-call-node-args node) kids)) + ((js2-new-node-p node) + (setf (js2-new-node-args node) kids)) + ((js2-var-decl-node-p node) + (setf (js2-var-decl-node-kids node) kids)) + (t + (error "Unsupported node type: %s" (js2-node-short-name node)))) + kids) + +;; All because Common Lisp doesn't support multiple inheritance for defstructs. +(defconst js2-paren-expr-nodes + '(cl-struct-js2-array-comp-loop-node + cl-struct-js2-array-comp-node + cl-struct-js2-call-node + cl-struct-js2-catch-node + cl-struct-js2-do-node + cl-struct-js2-elem-get-node + cl-struct-js2-for-in-node + cl-struct-js2-for-node + cl-struct-js2-function-node + cl-struct-js2-if-node + cl-struct-js2-let-expr-node + cl-struct-js2-let-stmt-node + cl-struct-js2-new-node + cl-struct-js2-paren-node + cl-struct-js2-switch-node + cl-struct-js2-while-node + cl-struct-js2-with-node) + "Node types that can have a parenthesized child expression. +In particular, nodes that respond to `js2-node-lp' and `js2-node-rp'.") + +(defsubst js2-paren-expr-node-p (node) + "Return t for nodes that typically have a parenthesized child expression. +Useful for computing the indentation anchors for arg-lists and conditions. +Note that it may return a false positive, for instance when NODE is +a `js2-new-node' and there are no arguments or parentheses." + (memq (aref node 0) js2-paren-expr-nodes)) + +;; Fake polymorphism... yech. +(defsubst js2-node-lp (node) + "Return relative left-paren position for NODE, if applicable. +For `js2-elem-get-node' structs, returns left-bracket position. +Note that the position may be nil in the case of a parse error." + (cond + ((js2-elem-get-node-p node) + (js2-elem-get-node-lb node)) + ((js2-loop-node-p node) + (js2-loop-node-lp node)) + ((js2-function-node-p node) + (js2-function-node-lp node)) + ((js2-if-node-p node) + (js2-if-node-lp node)) + ((js2-new-node-p node) + (js2-new-node-lp node)) + ((js2-call-node-p node) + (js2-call-node-lp node)) + ((js2-paren-node-p node) + (js2-node-pos node)) + ((js2-switch-node-p node) + (js2-switch-node-lp node)) + ((js2-catch-node-p node) + (js2-catch-node-lp node)) + ((js2-let-expr-node-p node) + (js2-let-expr-node-lp node)) + ((js2-let-stmt-node-p node) + (js2-let-stmt-node-lp node)) + ((js2-array-comp-node-p node) + (js2-array-comp-node-lp node)) + ((js2-with-node-p node) + (js2-with-node-lp node)) + (t + (error "Unsupported node type: %s" (js2-node-short-name node))))) + +;; Fake polymorphism... blech. +(defsubst js2-node-rp (node) + "Return relative right-paren position for NODE, if applicable. +For `js2-elem-get-node' structs, returns right-bracket position. +Note that the position may be nil in the case of a parse error." + (cond + ((js2-elem-get-node-p node) + (js2-elem-get-node-lb node)) + ((js2-loop-node-p node) + (js2-loop-node-rp node)) + ((js2-function-node-p node) + (js2-function-node-rp node)) + ((js2-if-node-p node) + (js2-if-node-rp node)) + ((js2-new-node-p node) + (js2-new-node-rp node)) + ((js2-call-node-p node) + (js2-call-node-rp node)) + ((js2-paren-node-p node) + (+ (js2-node-pos node) (js2-node-len node))) + ((js2-switch-node-p node) + (js2-switch-node-rp node)) + ((js2-catch-node-p node) + (js2-catch-node-rp node)) + ((js2-let-expr-node-p node) + (js2-let-expr-node-rp node)) + ((js2-let-stmt-node-p node) + (js2-let-stmt-node-rp node)) + ((js2-array-comp-node-p node) + (js2-array-comp-node-rp node)) + ((js2-with-node-p node) + (js2-with-node-rp node)) + (t + (error "Unsupported node type: %s" (js2-node-short-name node))))) + +(defsubst js2-node-first-child (node) + "Returns the first element of `js2-node-child-list' for NODE." + (car (js2-node-child-list node))) + +(defsubst js2-node-last-child (node) + "Returns the last element of `js2-node-last-child' for NODE." + (car (last (js2-node-child-list node)))) + +(defun js2-node-prev-sibling (node) + "Return the previous statement in parent. +Works for parents supported by `js2-node-child-list'. +Returns nil if NODE is not in the parent, or PARENT is +not a supported node, or if NODE is the first child." + (let* ((p (js2-node-parent node)) + (kids (js2-node-child-list p)) + (sib (car kids))) + (while (and kids + (neq node (cadr kids))) + (setq kids (cdr kids) + sib (car kids))) + sib)) + +(defun js2-node-next-sibling (node) + "Return the next statement in parent block. +Returns nil if NODE is not in the block, or PARENT is not +a block node, or if NODE is the last statement." + (let* ((p (js2-node-parent node)) + (kids (js2-node-child-list p))) + (while (and kids + (neq node (car kids))) + (setq kids (cdr kids))) + (cadr kids))) + +(defun js2-node-find-child-before (pos parent &optional after) + "Find the last child that starts before POS in parent. +If AFTER is non-nil, returns first child starting after POS. +POS is an absolute buffer position. PARENT is any node +supported by `js2-node-child-list'. +Returns nil if no applicable child is found." + (let ((kids (if (js2-function-node-p parent) + (js2-block-node-kids (js2-function-node-body parent)) + (js2-node-child-list parent))) + (beg (if (js2-function-node-p parent) + (js2-node-abs-pos (js2-function-node-body parent)) + (js2-node-abs-pos parent))) + kid + result + fn + (continue t)) + (setq fn (if after '> '<)) + (while (and kids continue) + (setq kid (car kids)) + (if (funcall fn (+ beg (js2-node-pos kid)) pos) + (setq result kid + continue (if after nil t)) + (setq continue (if after t nil))) + (setq kids (cdr kids))) + result)) + +(defun js2-node-find-child-after (pos parent) + "Find first child that starts after POS in parent. +POS is an absolute buffer position. PARENT is any node +supported by `js2-node-child-list'. +Returns nil if no applicable child is found." + (js2-node-find-child-before pos parent 'after)) + +(defun js2-node-replace-child (pos parent new-node) + "Replace node at index POS in PARENT with NEW-NODE. +Only works for parents supported by `js2-node-child-list'." + (let ((kids (js2-node-child-list parent)) + (i 0)) + (while (< i pos) + (setq kids (cdr kids) + i (1+ i))) + (setcar kids new-node) + (js2-node-add-children parent new-node))) + +(defun js2-node-buffer (n) + "Return the buffer associated with AST N. +Returns nil if the buffer is not set as a property on the root +node, or if parent links were not recorded during parsing." + (let ((root (js2-node-root n))) + (and root + (js2-ast-root-p root) + (js2-ast-root-buffer root)))) + +(defsubst js2-block-node-push (n kid) + "Push js2-node KID onto the end of js2-block-node N's child list. +KID is always added to the -end- of the kids list. +Function also calls `js2-node-add-children' to add the parent link." + (let ((kids (js2-node-child-list n))) + (if kids + (setcdr kids (nconc (cdr kids) (list kid))) + (js2-node-set-child-list n (list kid))) + (js2-node-add-children n kid))) + +(defun js2-node-string (node) + (let ((buf (js2-node-buffer node)) + pos) + (unless buf + (error "No buffer available for node %s" node)) + (save-excursion + (set-buffer buf) + (buffer-substring-no-properties (setq pos (js2-node-abs-pos node)) + (+ pos (js2-node-len node)))))) + +;; Container for storing the node we're looking for in a traversal. +(defvar js2-discovered-node nil) +(make-variable-buffer-local 'js2-discovered-node) + +;; Keep track of absolute node position during traversals. +(defvar js2-visitor-offset nil) +(make-variable-buffer-local 'js2-visitor-offset) + +(defvar js2-node-search-point nil) +(make-variable-buffer-local 'js2-node-search-point) + +(when js2-mode-dev-mode-p + (defun js2-find-node-at-point () + (interactive) + (let ((node (js2-node-at-point))) + (message "%s" (or node "No node found at point")))) + (defun js2-node-name-at-point () + (interactive) + (let ((node (js2-node-at-point))) + (message "%s" (if node + (js2-node-short-name node) + "No node found at point."))))) + +(defun js2-node-at-point (&optional pos skip-comments) + "Return AST node at POS, a buffer position, defaulting to current point. +The `js2-mode-ast' variable must be set to the current parse tree. +Signals an error if the AST (`js2-mode-ast') is nil. +Always returns a node - if it can't find one, it returns the root. +If SKIP-COMMENTS is non-nil, comment nodes are ignored." + (let ((ast js2-mode-ast) + result) + (unless ast + (error "No JavaScript AST available")) + ;; Look through comments first, since they may be inside nodes that + ;; would otherwise report a match. + (setq pos (or pos (point)) + result (if (> pos (js2-node-abs-end ast)) + ast + (if (not skip-comments) + (js2-comment-at-point pos)))) + (unless result + (setq js2-discovered-node nil + js2-visitor-offset 0 + js2-node-search-point pos) + (unwind-protect + (catch 'js2-visit-done + (js2-visit-ast ast #'js2-node-at-point-visitor)) + (setq js2-visitor-offset nil + js2-node-search-point nil)) + (setq result js2-discovered-node)) + ;; may have found a comment beyond end of last child node, + ;; since visiting the ast-root looks at the comment-list last. + (if (and skip-comments + (js2-comment-node-p result)) + (setq result nil)) + (or result js2-mode-ast))) + +(defun js2-node-at-point-visitor (node end-p) + (let ((rel-pos (js2-node-pos node)) + abs-pos + abs-end + (point js2-node-search-point)) + (cond + (end-p + ;; this evaluates to a non-nil return value, even if it's zero + (decf js2-visitor-offset rel-pos)) + ;; we already looked for comments before visiting, and don't want them now + ((js2-comment-node-p node) + nil) + (t + (setq abs-pos (incf js2-visitor-offset rel-pos) + ;; we only want to use the node if the point is before + ;; the last character position in the node, so we decrement + ;; the absolute end by 1. + abs-end (+ abs-pos (js2-node-len node) -1)) + (cond + ;; If this node starts after search-point, stop the search. + ((> abs-pos point) + (throw 'js2-visit-done nil)) + ;; If this node ends before the search-point, don't check kids. + ((> point abs-end) + nil) + (t + ;; Otherwise point is within this node, possibly in a child. + (setq js2-discovered-node node) + t)))))) ; keep processing kids to look for more specific match + +(defsubst js2-block-comment-p (node) + "Return non-nil if NODE is a comment node of format `jsdoc' or `block'." + (and (js2-comment-node-p node) + (memq (js2-comment-node-format node) '(jsdoc block)))) + +;; TODO: put the comments in a vector and binary-search them instead +(defun js2-comment-at-point (&optional pos) + "Look through scanned comment nodes for one containing POS. +POS is a buffer position that defaults to current point. +Function returns nil if POS was not in any comment node." + (let ((ast js2-mode-ast) + (x (or pos (point))) + beg + end) + (unless ast + (error "No JavaScript AST available")) + (catch 'done + ;; Comments are stored in lexical order. + (dolist (comment (js2-ast-root-comments ast) nil) + (setq beg (js2-node-abs-pos comment) + end (+ beg (js2-node-len comment))) + (if (and (>= x beg) + (<= x end)) + (throw 'done comment)))))) + +(defun js2-mode-find-enclosing-fn (node) + (if (js2-ast-root-p node) + node + (setq node (js2-node-parent node)) + (while (not (or (js2-ast-root-p node) + (js2-function-node-p node))) + (setq node (js2-node-parent node))) + node)) + +(defun js2-mode-find-enclosing-node (beg end) + "Find script or function fully enclosing BEG and END." + (let ((node (js2-node-at-point beg)) + pos + (continue t)) + (while continue + (if (or (js2-ast-root-p node) + (and (js2-function-node-p node) + (<= (setq pos (js2-node-abs-pos node)) beg) + (>= (+ pos (js2-node-len node)) end))) + (setq continue nil) + (setq node (js2-node-parent node)))) + node)) + +(defun js2-node-parent-script-or-fn (node) + "Find script or function immediately enclosing NODE. +If NODE is the ast-root, returns nil." + (if (js2-ast-root-p node) + nil + (setq node (js2-node-parent node)) + (while (and node (not (or (js2-function-node-p node) + (js2-script-node-p node)))) + (setq node (js2-node-parent node))) + node)) + +(defsubst js2-mode-find-first-stmt (node) + "Search upward starting from NODE looking for a statement. +For purposes of this function, a `js2-function-node' counts." + (while (not (or (js2-stmt-node-p node) + (js2-function-node-p node))) + (setq node (js2-node-parent node))) + node) + +(defsubst js2-nested-function-p (node) + "Return t if NODE is a nested function, or is inside a nested function." + (js2-function-node-p (if (js2-function-node-p node) + (js2-node-parent-script-or-fn node) + (js2-node-parent-script-or-fn + (js2-node-parent-script-or-fn node))))) + +(defsubst js2-mode-shift-kids (kids start offset) + (dolist (kid kids) + (if (> (js2-node-pos kid) start) + (incf (js2-node-pos kid) offset)))) + +(defsubst js2-mode-shift-children (parent start offset) + "Update start-positions of all children of PARENT beyond START." + (let ((root (js2-node-root parent))) + (js2-mode-shift-kids (js2-node-child-list parent) start offset) + (js2-mode-shift-kids (js2-ast-root-comments root) start offset))) + +(defsubst js2-node-is-descendant (node ancestor) + "Return t if NODE is a descendant of ANCESTOR." + (while (and node + (neq node ancestor)) + (setq node (js2-node-parent node))) + node) + +;;; visitor infrastructure + +(defun js2-visit-none (node callback) + "Visitor for AST node that have no node children." + nil) + +(defun js2-print-none (node indent) + "Visitor for AST node with no printed representation.") + +(defun js2-print-body (node indent) + "Print a statement, or a block without braces." + (if (js2-block-node-p node) + (dolist (kid (js2-block-node-kids node)) + (js2-print-ast kid indent)) + (js2-print-ast node indent))) + +(defun js2-print-list (args &optional delimiter) + (loop with len = (length args) + for arg in args + for count from 1 + do + (js2-print-ast arg 0) + (if (< count len) + (insert (or delimiter ", "))))) + +(defun js2-print-tree (ast) + "Prints an AST to the current buffer. +Makes `js2-ast-parent-nodes' available to the printer functions." + (let ((max-lisp-eval-depth (max max-lisp-eval-depth 1500))) + (js2-print-ast ast))) + +(defun js2-print-ast (node &optional indent) + "Helper function for printing AST nodes. +Requires `js2-ast-parent-nodes' to be non-nil. +You should use `js2-print-tree' instead of this function." + (let ((printer (get (aref node 0) 'js2-printer)) + (i (or indent 0)) + (pos (js2-node-abs-pos node))) + ;; TODO: wedge comments in here somewhere + (if printer + (funcall printer node i)))) + +;; Symbol-table support. Unfortunately defstruct doesn't support +;; multiple inheritance, so we use delegation: any node type that +;; introduces a new scope (a script, function or let-node) has +;; an associated scope field containing a `js2-scope', which +;; we must fetch when doing scope operations. This scope node has +;; two "parent" pointers: its parent scope node, and its associated +;; AST node. This lets us climb up the scope chain and then figure +;; out which AST node we're at. + +(defstruct (js2-symbol + (:constructor nil) + (:constructor make-js2-symbol (decl-type name &optional ast-node))) + "A symbol table entry." + ;; One of js2-FUNCTION, js2-LP (for parameters), js2-VAR, + ;; js2-LET, or js2-CONST + decl-type + name ; string + ast-node) ; a `js2-node' + +(defstruct (js2-scope + (:constructor nil) + (:constructor make-js2-scope (&key type + (ast-node nil)))) + ;; The symbol-table is a LinkedHashMap in Rhino. + ;; I don't have one of those handy, so I'll use an alist for now. + ;; It's as fast as an emacs hashtable for up to about 50 elements, + ;; and is much lighter-weight to construct (both CPU and mem). + ;; The keys are interned strings (symbols) for faster lookup. + ;; Should switch to hybrid alist/hashtable eventually. + type ; the AST token type, e.g. js2-FUNCTION + symbols ; an alist of (symbol . js2-symbol) + parent ; a `js2-scope' + ast-node) ; ast node: a `js2-node' + +(defun js2-node-scope (node) + "Return the `js2-scope' for NODE. +Signals an error if NODE is not a scope node." + (let ((tt (js2-node-type node))) + (cond + ;; fake polymorphism + ((= tt js2-FUNCTION) + (js2-function-node-scope node)) + ((= tt js2-SCRIPT) + (js2-script-node-scope node)) + ((= tt js2-BLOCK) + (js2-block-node-scope node)) + ((js2-loop-node-p node) + (js2-loop-node-scope node)) + ((= tt js2-LETEXPR) + (js2-let-expr-node-scope node)) + ((= tt js2-LET) + (js2-let-stmt-node-scope node)) + (t + (error "%s is not a scope node" (js2-node-short-name node)))))) + +(defun js2-node-set-scope (node scope) + "Set the `js2-scope' for NODE, and return SCOPE. +Signals an error if NODE is not a scope node." + (let ((tt (js2-node-type node))) + (cond + ;; fake polymorphism + ((= tt js2-FUNCTION) + (setf (js2-function-node-scope node) scope)) + ((= tt js2-SCRIPT) + (setf (js2-script-node-scope node) scope)) + ((= tt js2-BLOCK) + (setf (js2-block-node-scope node) scope)) + ((js2-loop-node-p node) + (setf (js2-loop-node-scope node) scope)) + ((= tt js2-LETEXPR) + (setf (js2-let-expr-node-scope node) scope)) + ((= tt js2-LET) + (setf (js2-let-stmt-node-scope node) scope)) + (t + (error "%s is not a scope node" (js2-node-short-name node)))) + scope)) + +(defconst js2-scope-node-types + (list js2-FUNCTION js2-SCRIPT js2-BLOCK js2-LETEXPR js2-LET + js2-FOR js2-WHILE js2-DO)) + +(defsubst js2-scope-node-p (node) + "Return t if NODE is a node associated with a `js2-scope'." + (memq (js2-node-type node) js2-scope-node-types)) + +(defun js2-node-get-enclosing-scope (node) + "Return the innermost `js2-scope' node surrounding NODE. +Returns nil if there is no enclosing scope node." + (let ((parent (js2-node-parent node))) + ;; loop until we have a scope-node parent with a non-nil scope + (while (and parent + (or (not (js2-scope-node-p parent)) + (null (js2-node-scope parent)))) + (setq parent (js2-node-parent parent))) + parent)) + +(defun js2-get-defining-scope (scope name) + "Search up scope chain from SCOPE looking for NAME, a string or symbol. +Returns `js2-scope' in which NAME is defined, or nil if not found." + (let ((sym (if (symbolp name) + name + (intern name))) + table + result + (continue t)) + (while (and scope continue) + (if (and (setq table (js2-scope-symbols scope)) + (assq sym table)) + (setq continue nil + result scope) + (setq scope (js2-scope-parent scope)))) + result)) + +(defsubst js2-scope-get-symbol (scope name) + "Return symbol table entry for NAME in SCOPE. +NAME can be a string or symbol. Returns a `js2-symbol' or nil if not found." + (and (js2-scope-symbols scope) + (cdr (assq (if (symbolp name) + name + (intern name)) + (js2-scope-symbols scope))))) + +(defsubst js2-scope-put-symbol (scope name symbol) + "Enter SYMBOL into symbol-table for SCOPE under NAME. +NAME can be a lisp symbol or string. SYMBOL is a `js2-symbol'." + (let* ((table (js2-scope-symbols scope)) + (sym (if (symbolp name) name (intern name))) + (entry (assq sym table))) + (if entry + (setcdr entry symbol) + (push (cons sym symbol) + (js2-scope-symbols scope))))) + +(defconst js2-side-effecting-tokens + (let ((tokens (make-bool-vector js2-num-tokens nil))) + (dolist (tt (list js2-EXPR_RESULT + js2-ASSIGN + js2-ASSIGN_ADD + js2-ASSIGN_SUB + js2-ASSIGN_MUL + js2-ASSIGN_DIV + js2-ASSIGN_MOD + js2-ASSIGN_BITOR + js2-ASSIGN_BITXOR + js2-ASSIGN_BITAND + js2-ASSIGN_LSH + js2-ASSIGN_RSH + js2-ASSIGN_URSH + js2-ENTERWITH + js2-LEAVEWITH + js2-RETURN + js2-GOTO + js2-IFEQ + js2-IFNE + js2-NEW + js2-DELPROP + js2-SETNAME + js2-SETPROP + js2-SETELEM + js2-CALL + js2-THROW + js2-RETHROW + js2-SETVAR + js2-CATCH_SCOPE + js2-RETURN_RESULT + js2-SET_REF + js2-DEL_REF + js2-REF_CALL + js2-TRY + js2-EMPTY + js2-SEMI + js2-INC + js2-DEC + js2-EXPORT + js2-IMPORT + js2-IF + js2-ELSE + js2-SWITCH + js2-WHILE + js2-DO + js2-FOR + js2-BREAK + js2-CONTINUE + js2-DEBUGGER + js2-VAR + js2-CONST + js2-LET + js2-LETEXPR + js2-WITH + js2-WITHEXPR + js2-CATCH + js2-FINALLY + js2-BLOCK + js2-LABEL + js2-TARGET + js2-LOOP + js2-JSR + js2-SETPROP_OP + js2-SETELEM_OP + js2-LOCAL_BLOCK + js2-SET_REF_OP + js2-YIELD)) + (aset tokens tt t)) + (if js2-instanceof-has-side-effects + (aset tokens js2-INSTANCEOF t)) + tokens)) + +(defun js2-node-has-side-effects (node) + "Return t if NODE has side effects." + (let ((tt (js2-node-type node)) + expr) + (cond + ;; This doubtless needs some work, since EXPR_VOID is used + ;; in several ways in Rhino, and I may not have caught them all. + ;; I'll wait for people to notice incorrect warnings. + ((and (= tt js2-EXPR_VOID) + (js2-expr-stmt-node-p node)) ; but not if EXPR_RESULT + (if (setq expr (js2-expr-stmt-node-expr node)) + (js2-node-has-side-effects expr) + t)) + ((= tt js2-COMMA) + (if (setq expr (js2-infix-node-right node)) + (js2-node-has-side-effects expr) + t)) + ((= tt js2-HOOK) + (and (js2-node-has-side-effects (js2-cond-node-true-expr node)) + (js2-node-has-side-effects (js2-cond-node-false-expr node)))) + ((= tt js2-ERROR) ; avoid cascaded error messages + nil) + (t + (aref js2-side-effecting-tokens tt))))) + +(defun js2-expr-at-point (node-or-position) + "Returns the outermost parent expression containing NODE-OR-POSITION. +NODE-OR-POSITION is a `js2-node' or subtype, or a buffer position." + (let ((n (if (numberp node-or-position) + (js2-node-at-point node-or-position) + node-or-position))) + (while (js2-expr-node-p (js2-node-parent n)) + (setq n (js2-node-parent n))) + n)) + +(defun js2-member-expr-leftmost-name (node) + "For an expr such as foo.bar.baz, return leftmost node foo. +NODE is any `js2-node' object. If it represents a member expression, +which is any sequence of property gets, element-gets, function calls, +or xml descendants/filter operators, then we look at the lexically +leftmost (first) node in the chain. If it is a name-node we return it. +Note that NODE can be a raw name-node and it will be returned as well. +If NODE is not a name-node or member expression, or if it is a member +expression whose leftmost target is not a name node, returns nil." + (let ((continue t) + result) + (while (and continue (not result)) + (cond + ((js2-name-node-p node) + (setq result node)) + ((js2-prop-get-node-p node) + (setq node (js2-prop-get-node-target node))) + ;; TODO: handle call-nodes, xml-nodes, others? + (t + (setq continue nil)))) + result)) + +(defalias #'js2-ancestor-expr #'js2-expr-at-point) + +(provide 'js2-ast) + +;;; js2-ast.el ends here +;;; js2-highlight.el --- JavaScript syntax coloring support + +;; Author: Steve Yegge (steve.yegge@gmail.com) +;; Keywords: javascript languages + +;;; Code: + + +(defsubst js2-set-face (beg end face &optional record) + "Fontify a region. If RECORD is non-nil, record for later." + (when (plusp js2-highlight-level) + (setq beg (min (point-max) beg) + beg (max (point-min) beg) + end (min (point-max) end) + end (max (point-min) end)) + (if record + (push (list beg end face) js2-mode-fontifications) + (put-text-property beg end 'face face)))) + +(defsubst js2-set-kid-face (pos kid len face) + "Set-face on a child node. +POS is absolute buffer position of parent. +KID is the child node. +LEN is the length to fontify. +FACE is the face to fontify with." + (js2-set-face (+ pos (js2-node-pos kid)) + (+ pos (js2-node-pos kid) (js2-node-len kid)) + face)) + +(defsubst js2-fontify-kwd (start length) + (js2-set-face start (+ start length) 'font-lock-keyword-face)) + +(defsubst js2-clear-face (beg end) + (remove-text-properties beg end '(face nil + help-echo nil + point-entered nil + c-in-sws nil))) + +(defsubst js2-record-text-property (beg end prop value) + "Record a text property to set when parsing finishes." + (push (list beg end prop value) js2-mode-deferred-properties)) + +(defconst js2-ecma-global-props + (concat "^" + (regexp-opt + '("Infinity" "NaN" "undefined" "arguments") t) + "$") + "Value properties of the Ecma-262 Global Object. +Shown at or above `js2-highlight-level' 2.") + +;; might want to add the name "arguments" to this list? +(defconst js2-ecma-object-props + (concat "^" + (regexp-opt + '("prototype" "__proto__" "__parent__") t) + "$") + "Value properties of the Ecma-262 Object constructor. +Shown at or above `js2-highlight-level' 2.") + +(defconst js2-ecma-global-funcs + (concat + "^" + (regexp-opt + '("decodeURI" "decodeURIComponent" "encodeURI" "encodeURIComponent" + "eval" "isFinite" "isNaN" "parseFloat" "parseInt") t) + "$") + "Function properties of the Ecma-262 Global object. +Shown at or above `js2-highlight-level' 2.") + +(defconst js2-ecma-number-props + (concat "^" + (regexp-opt '("MAX_VALUE" "MIN_VALUE" "NaN" + "NEGATIVE_INFINITY" + "POSITIVE_INFINITY") t) + "$") + "Properties of the Ecma-262 Number constructor. +Shown at or above `js2-highlight-level' 2.") + +(defconst js2-ecma-date-props "^\\(parse\\|UTC\\)$" + "Properties of the Ecma-262 Date constructor. +Shown at or above `js2-highlight-level' 2.") + + +(defconst js2-ecma-math-props + (concat "^" + (regexp-opt + '("E" "LN10" "LN2" "LOG2E" "LOG10E" "PI" "SQRT1_2" "SQRT2") + t) + "$") + "Properties of the Ecma-262 Math object. +Shown at or above `js2-highlight-level' 2.") + + +(defconst js2-ecma-math-funcs + (concat "^" + (regexp-opt + '("abs" "acos" "asin" "atan" "atan2" "ceil" "cos" "exp" "floor" + "log" "max" "min" "pow" "random" "round" "sin" "sqrt" "tan") t) + "$") + "Function properties of the Ecma-262 Math object. +Shown at or above `js2-highlight-level' 2.") + +(defconst js2-ecma-function-props + (concat + "^" + (regexp-opt + '(;; properties of the Object prototype object + "hasOwnProperty" "isPrototypeOf" "propertyIsEnumerable" + "toLocaleString" "toString" "valueOf" + ;; properties of the Function prototype object + "apply" "call" + ;; properties of the Array prototype object + "concat" "join" "pop" "push" "reverse" "shift" "slice" "sort" + "splice" "unshift" + ;; properties of the String prototype object + "charAt" "charCodeAt" "fromCharCode" "indexOf" "lastIndexOf" + "localeCompare" "match" "replace" "search" "split" "substring" + "toLocaleLowerCase" "toLocaleUpperCase" "toLowerCase" + "toUpperCase" + ;; properties of the Number prototype object + "toExponential" "toFixed" "toPrecision" + ;; properties of the Date prototype object + "getDate" "getDay" "getFullYear" "getHours" "getMilliseconds" + "getMinutes" "getMonth" "getSeconds" "getTime" + "getTimezoneOffset" "getUTCDate" "getUTCDay" "getUTCFullYear" + "getUTCHours" "getUTCMilliseconds" "getUTCMinutes" "getUTCMonth" + "getUTCSeconds" "setDate" "setFullYear" "setHours" + "setMilliseconds" "setMinutes" "setMonth" "setSeconds" "setTime" + "setUTCDate" "setUTCFullYear" "setUTCHours" "setUTCMilliseconds" + "setUTCMinutes" "setUTCMonth" "setUTCSeconds" "toDateString" + "toLocaleDateString" "toLocaleString" "toLocaleTimeString" + "toTimeString" "toUTCString" + ;; properties of the RegExp prototype object + "exec" "test" + ;; SpiderMonkey/Rhino extensions, versions 1.5+ + "toSource" "__defineGetter__" "__defineSetter__" + "__lookupGetter__" "__lookupSetter__" "__noSuchMethod__" + "every" "filter" "forEach" "lastIndexOf" "map" "some") + t) + "$") + "Built-in functions defined by Ecma-262 and SpiderMonkey extensions. +Shown at or above `js2-highlight-level' 3.") + +(defsubst js2-parse-highlight-prop-get (parent target prop call-p) + (let ((target-name (and target + (js2-name-node-p target) + (js2-name-node-name target))) + (prop-name (if prop (js2-name-node-name prop))) + (level1 (>= js2-highlight-level 1)) + (level2 (>= js2-highlight-level 2)) + (level3 (>= js2-highlight-level 3)) + pos + face) + (when level2 + (if call-p + (cond + ((and target prop) + (cond + ((and level3 (string-match js2-ecma-function-props prop-name)) + (setq face 'font-lock-builtin-face)) + ((and target-name prop) + (cond + ((string= target-name "Date") + (if (string-match js2-ecma-date-props prop-name) + (setq face 'font-lock-builtin-face))) + ((string= target-name "Math") + (if (string-match js2-ecma-math-funcs prop-name) + (setq face 'font-lock-builtin-face))))))) + (prop + (if (string-match js2-ecma-global-funcs prop-name) + (setq face 'font-lock-builtin-face)))) + (cond + ((and target prop) + (cond + ((string= target-name "Number") + (if (string-match js2-ecma-number-props prop-name) + (setq face 'font-lock-constant-face))) + ((string= target-name "Math") + (if (string-match js2-ecma-math-props prop-name) + (setq face 'font-lock-constant-face))))) + (prop + (if (string-match js2-ecma-object-props prop-name) + (setq face 'font-lock-constant-face))))) + (when face + (js2-set-face (setq pos (+ (js2-node-pos parent) ; absolute + (js2-node-pos prop))) ; relative + (+ pos (js2-node-len prop)) + face))))) + +(defun js2-parse-highlight-member-expr-node (node) + "Perform syntax highlighting of EcmaScript built-in properties. +The variable `js2-highlight-level' governs this highighting." + (let (face target prop name pos end parent call-p callee) + (cond + ;; case 1: simple name, e.g. foo + ((js2-name-node-p node) + (setq name (js2-name-node-name node)) + ;; possible for name to be nil in rare cases - saw it when + ;; running js2-mode on an elisp buffer. Might as well try to + ;; make it so js2-mode never barfs. + (when name + (setq face (if (string-match js2-ecma-global-props name) + 'font-lock-constant-face)) + (when face + (setq pos (js2-node-pos node) + end (+ pos (js2-node-len node))) + (js2-set-face pos end face)))) + + ;; case 2: property access or function call + ((or (js2-prop-get-node-p node) + ;; highlight function call if expr is a prop-get node + ;; or a plain name (i.e. unqualified function call) + (and (setq call-p (js2-call-node-p node)) + (setq callee (js2-call-node-expr node)) ; separate setq! + (or (js2-prop-get-node-p callee) + (js2-name-node-p callee)))) + (setq parent node + node (if call-p callee node)) + (if (and call-p (js2-name-node-p callee)) + (setq prop callee) + (setq target (js2-prop-get-node-target node) + prop (js2-prop-get-node-prop node))) + (cond + ((js2-name-node-p target) + (if (js2-name-node-p prop) + ;; case 2a: simple target, simple prop name, e.g. foo.bar + (js2-parse-highlight-prop-get parent target prop call-p) + ;; case 2b: simple target, complex name, e.g. foo.x[y] + (js2-parse-highlight-prop-get parent target nil call-p))) + ((js2-name-node-p prop) + ;; case 2c: complex target, simple name, e.g. x[y].bar + (js2-parse-highlight-prop-get parent target prop call-p))))))) + +;; source: http://jsdoc.sourceforge.net/ +;; Note - this syntax is for Google's enhanced jsdoc parser that +;; allows type specifications, and needs work before entering the wild. + +(defconst js2-jsdoc-param-tag-regexp + (concat "^\\s-*\\*+\\s-*\\(@" + "\\(?:param\\|argument\\)" + "\\)" + "\\s-*\\({[^}]+}\\)?" ; optional type + "\\s-*\\([a-zA-Z0-9_$]+\\)?" ; name + "\\>") + "Matches jsdoc tags with optional type and optional param name.") + +(defconst js2-jsdoc-typed-tag-regexp + (concat "^\\s-*\\*+\\s-*\\(@\\(?:" + (regexp-opt + '("requires" "return" "returns" "throw" "throws")) + "\\)\\)\\s-*\\({[^}]+}\\)?") + "Matches jsdoc tags with optional type.") + +(defconst js2-jsdoc-arg-tag-regexp + (concat "^\\s-*\\*+\\s-*\\(@\\(?:" + (regexp-opt + '("author" "base" "extends" "member" "type" "version")) + "\\)\\)\\s-+\\([^ \t]+\\)") + "Matches jsdoc tags with a single argument.") + +(defconst js2-jsdoc-empty-tag-regexp + (concat "^\\s-*\\*+\\s-*\\(@\\(?:" + (regexp-opt + '("addon" "class" "constructor" "deprecated" "exec" + "exception" "fileoverview" "final" "ignore" "private")) + "\\)\\)\\s-*") + "Matches empty jsdoc tags.") + +(defconst js2-jsdoc-link-tag-regexp + "{\\(@link\\)\\s-+\\([^#}\n]+\\)\\(#.+\\)?}" + "Matches a jsdoc link tag.") + +(defconst js2-jsdoc-see-tag-regexp + "^\\s-*\\*+\\s-*\\(@see\\)\\s-+\\([^#}\n]+\\)\\(#.+\\)?" + "Matches a jsdoc @see tag.") + +(defconst js2-jsdoc-html-tag-regexp + "\\(\\)" + "Matches a simple (no attributes) html start- or end-tag.") + +(defsubst js2-jsdoc-highlight-helper () + (js2-set-face (match-beginning 1) + (match-end 1) + 'js2-jsdoc-tag-face) + (if (match-beginning 2) + (if (save-excursion + (goto-char (match-beginning 2)) + (= (char-after) ?{)) + (js2-set-face (1+ (match-beginning 2)) + (1- (match-end 2)) + 'js2-jsdoc-type-face) + (js2-set-face (match-beginning 2) + (match-end 2) + 'js2-jsdoc-value-face))) + (if (match-beginning 3) + (js2-set-face (match-beginning 3) + (match-end 3) + 'js2-jsdoc-value-face))) + +(defun js2-highlight-jsdoc (ast) + "Highlight doc comment tags." + (let ((comments (js2-ast-root-comments ast)) + beg end) + (dolist (node comments) + (when (eq (js2-comment-node-format node) 'jsdoc) + (setq beg (js2-node-abs-pos node) + end (+ beg (js2-node-len node))) + (save-restriction + (narrow-to-region beg end) + (dolist (re (list js2-jsdoc-param-tag-regexp + js2-jsdoc-typed-tag-regexp + js2-jsdoc-arg-tag-regexp + js2-jsdoc-link-tag-regexp + js2-jsdoc-see-tag-regexp + js2-jsdoc-empty-tag-regexp)) + (goto-char beg) + (while (re-search-forward re nil t) + (js2-jsdoc-highlight-helper))) + ;; simple highlighting for html tags + (goto-char beg) + (while (re-search-forward js2-jsdoc-html-tag-regexp nil t) + (js2-set-face (match-beginning 1) + (match-end 1) + 'js2-jsdoc-html-tag-delimiter-face) + (js2-set-face (match-beginning 2) + (match-end 2) + 'js2-jsdoc-html-tag-name-face) + (js2-set-face (match-beginning 3) + (match-end 3) + 'js2-jsdoc-html-tag-delimiter-face))))))) + +(defun js2-highlight-assign-targets (node left right) + "Highlight function properties and external variables." + (let (leftpos end name) + ;; highlight vars and props assigned function values + (when (js2-function-node-p right) + (cond + ;; var foo = function() {...} + ((js2-name-node-p left) + (setq name left)) + + ;; foo.bar.baz = function() {...} + ((and (js2-prop-get-node-p left) + (js2-name-node-p (js2-prop-get-node-prop left))) + (setq name (js2-prop-get-node-prop left)))) + + (when name + (js2-set-face (setq leftpos (js2-node-abs-pos name)) + (+ leftpos (js2-node-len name)) + 'font-lock-function-name-face + 'record))) + + ;; save variable assignments so we can check for undeclared later + ;; (can't do it here since var decls can come at end of script) + (when (and js2-highlight-external-variables + (setq name (js2-member-expr-leftmost-name left))) + (push (list name js2-current-scope + (setq leftpos (js2-node-abs-pos name)) + (setq end (+ leftpos (js2-node-len name)))) + js2-recorded-assignments)))) + +(defun js2-highlight-undeclared-vars () + "After entire parse is finished, look for undeclared variable assignments. +Have to wait until entire buffer is parsed, since JavaScript permits var +decls to occur after they're used. + +We currently use a simple heuristic to rule out complaining about built-ins: +if the name is capitalized we don't highlight it. This could be improved a +bit by declaring all the Ecma global object, constructor and function names +in a hashtable, but we'd still wind up complaining about all the DHTML +builtins, the Mozilla builtins, etc." + (let (name first-char) + (dolist (entry js2-recorded-assignments) + (destructuring-bind (name-node scope pos end) entry + (setq name (js2-name-node-name name-node) + first-char (aref name 0)) + (unless (or (and (>= first-char ?A) (<= first-char ?Z)) + (js2-get-defining-scope scope name)) + (js2-set-face pos end 'js2-external-variable-face 'record) + (js2-record-text-property pos end 'help-echo "Undeclared variable") + (js2-record-text-property pos end 'point-entered #'js2-echo-help)))) + (setq js2-recorded-assignments nil))) + +(provide 'js2-highlight) + +;;; js2-highlight.el ends here +;;; js2-browse.el --- browsing/hierarchy support for js2-mode + +;; Author: Steve Yegge (steve.yegge@gmail.com) +;; Keywords: javascript languages + +;; Commentary: +;; +;; We currently only support imenu, but eventually should support speedbar and +;; possibly other browsing mechanisms. +;; +;; The basic strategy is to identify function assignment targets of the form +;; `foo.bar.baz', convert them to (list foo bar baz ), and push the +;; list into `js2-imenu-recorder'. The lists are merged into a trie-like tree +;; for imenu after parsing is finished. +;; +;; A `foo.bar.baz' assignment target may be expressed in many ways in +;; JavaScript, and the general problem is undecidable. However, several forms +;; are readily recognizable at parse-time; the forms we attempt to recognize +;; include: +;; +;; function foo() -- function declaration +;; foo = function() -- function expression assigned to variable +;; foo.bar.baz = function() -- function expr assigned to nested property-get +;; foo = {bar: function()} -- fun prop in object literal assigned to var +;; foo = {bar: {baz: function()}} -- inside nested object literal +;; foo.bar = {baz: function()}} -- obj lit assigned to nested prop get +;; a.b = {c: {d: function()}} -- nested obj lit assigned to nested prop get +;; foo = {get bar() {...}} -- getter/setter in obj literal +;; function foo() {function bar() {...}} -- nested function +;; foo['a'] = function() -- fun expr assigned to deterministic element-get +;; +;; This list boils down to a few forms that can be combined recursively. +;; Top-level named function declarations include both the left-hand (name) +;; and the right-hand (function value) expressions needed to produce an imenu +;; entry. The other "right-hand" forms we need to look for are: +;; - functions declared as props/getters/setters in object literals +;; - nested named function declarations +;; The "left-hand" expressions that functions can be assigned to include: +;; - local/global variables +;; - nested property-get expressions like a.b.c.d +;; - element gets like foo[10] or foo['bar'] where the index +;; expression can be trivially converted to a property name. They +;; effectively then become property gets. +;; +;; All the different definition types are canonicalized into the form +;; foo.bar.baz = position-of-function-keyword +;; +;; We need to build a trie-like structure for imenu. As an example, +;; consider the following JavaScript code: +;; +;; a = function() {...} // function at position 5 +;; b = function() {...} // function at position 25 +;; foo = function() {...} // function at position 100 +;; foo.bar = function() {...} // function at position 200 +;; foo.bar.baz = function() {...} // function at position 300 +;; foo.bar.zab = function() {...} // function at position 400 +;; +;; During parsing we accumulate an entry for each definition in +;; the variable `js2-imenu-recorder', like so: +;; +;; '((a 5) +;; (b 25) +;; (foo 100) +;; (foo bar 200) +;; (foo bar baz 300) +;; (foo bar zab 400)) +;; +;; After parsing these entries are merged into this alist-trie: +;; +;; '((a . 1) +;; (b . 2) +;; (foo ( . 3) +;; (bar ( . 6) +;; (baz . 100) +;; (zab . 200)))) +;; +;; Note the wacky need for a name. The token can be anything +;; that isn't a valid JavaScript identifier, because you might make foo +;; a function and then start setting properties on it that are also functions. + +;;; Code: + + +(defsubst js2-prop-node-name (node) + "Return the name of a node that may be a property-get/property-name. +If NODE is not a valid name-node, string-node or integral number-node, +returns nil. Otherwise returns the string name/value of the node." + (cond + ((js2-name-node-p node) + (js2-name-node-name node)) + ((js2-string-node-p node) + (js2-string-node-value node)) + ((and (js2-number-node-p node) + (string-match "^[0-9]+$" (js2-number-node-value node))) + (js2-number-node-value node)) + ((js2-this-node-p node) + "this"))) + +(defsubst js2-node-qname-component (node) + "Test function: return the name of this node, if it contributes to a qname. +Returns nil if the node doesn't contribute." + (copy-seq + (or (js2-prop-node-name node) + (if (and (js2-function-node-p node) + (js2-function-node-name node)) + (js2-name-node-name (js2-function-node-name node)))))) + +(defsubst js2-record-function-qname (fn-node qname) + "Associate FN-NODE with its QNAME for later lookup. +This is used in postprocessing the chain list. When we find a chain +whose first element is a js2-THIS keyword node, we look up the parent +function and see (using this map) whether it is the tail of a chain. +If so, we replace the this-node with a copy of the parent's qname." + (unless js2-imenu-function-map + (setq js2-imenu-function-map (make-hash-table :test 'eq))) + (puthash fn-node qname js2-imenu-function-map)) + +(defun js2-record-imenu-functions (node &optional var) + "Record function definitions for imenu. +NODE is a function node or an object literal. +VAR, if non-nil, is the expression that NODE is being assigned to." + (when js2-parse-ide-mode + (let ((fun-p (js2-function-node-p node)) + qname left fname-node pos) + (cond + ;; non-anonymous function declaration? + ((and fun-p + (not var) + (setq fname-node (js2-function-node-name node))) + (push (setq qname (list fname-node (js2-node-pos node))) + js2-imenu-recorder) + (js2-record-function-qname node qname)) + + ;; for remaining forms, compute left-side tree branch first + ((and var (setq qname (js2-compute-nested-prop-get var))) + (cond + ;; foo.bar.baz = function + (fun-p + (push (nconc qname (list (js2-node-pos node))) + js2-imenu-recorder) + (js2-record-function-qname node qname)) + ;; foo.bar.baz = object-literal + ;; look for nested functions: {a: {b: function() {...} }} + ((js2-object-node-p node) + (js2-record-object-literal node qname)))))))) + +(defun js2-compute-nested-prop-get (node) + "If NODE is of form foo.bar.baz, return component nodes as a list. +Otherwise returns nil. Element-gets can be treated as property-gets +if the index expression is a name, a string, or a positive integer." + (let (left right head) + (cond + ((or (js2-name-node-p node) + (js2-this-node-p node)) + (list node)) + ;; foo.bar.baz is parenthesized as (foo.bar).baz => right operand is a leaf + ((js2-prop-get-node-p node) ; includes elem-get nodes + (setq left (js2-prop-get-node-target node) + right (js2-prop-get-node-prop node)) + (if (and (or (js2-prop-get-node-p left) ; left == foo.bar + (js2-name-node-p left) + (js2-this-node-p left)) ; or left == foo + (or (js2-name-node-p right) ; .bar + (js2-string-node-p right) ; ['bar'] + (and (js2-number-node-p right) ; [10] + (string-match "^[0-9]+$" + (js2-number-node-value right))))) + (if (setq head (js2-compute-nested-prop-get left)) + (nconc head (list right)))))))) + +(defun js2-record-object-literal (node qname) + "Recursively process an object literal looking for functions. +NODE is an object literal that is the right-hand child of an assignment +expression. QNAME is a list of nodes representing the assignment target, +e.g. for foo.bar.baz = {...}, QNAME is (foo-node bar-node baz-node). +We do a depth-first traversal of NODE. Any functions we find are prefixed +with QNAME plus the property name of the function and appended to the +variable `js2-imenu-recorder'." + ;; Elements are relative to parent position, which is still absolute, + ;; since the parser passes the assignment target and value expressions + ;; to us before they are added as children of the assignment node. + (let ((pos (js2-node-pos node)) + left right) + (dolist (e (js2-object-node-elems node)) ; e is a `js2-object-prop-node' + (setq left (js2-infix-node-left e)) + (cond + ;; foo: function() {...} + ((js2-function-node-p (setq right (js2-infix-node-right e))) + (when (js2-prop-node-name left) + ;; As a policy decision, we record the position of the property, + ;; not the position of the `function' keyword, since the property + ;; is effectively the name of the function. + (push (append qname (list left) (list (+ pos (js2-node-pos e)))) + js2-imenu-recorder) + (js2-record-function-qname right qname))) + ;; foo: {object-literal} -- add foo to qname and recurse + ((js2-object-node-p right) + (js2-record-object-literal right + (append qname (list (js2-infix-node-left e))))))))) + +(defsubst js2-node-top-level-decl-p (node) + "Return t if NODE's name is defined in the top-level scope. +Also returns t if NODE's name is not defined in any scope, since it implies +that it's an external variable, which must also be in the top-level scope." + (let* ((name (js2-prop-node-name node)) + (this-scope (js2-node-get-enclosing-scope node)) + defining-scope) + (cond + ((js2-this-node-p node) + nil) + ((null this-scope) + t) + ((setq defining-scope (js2-get-defining-scope + (js2-node-scope this-scope) name)) + (js2-ast-root-p (js2-scope-ast-node defining-scope))) + (t t)))) + +(defun js2-browse-postprocess-chains (chains) + "Modify function-declaration name chains after parsing finishes. +Some of the information is only available after the parse tree is complete. +For instance, following a 'this' reference requires a parent function node." + (let (result head fn parent-chain p elem) + (dolist (chain chains) + ;; examine the head of each node to get its defining scope + (setq head (car chain)) + (cond + ;; if top-level/external, keep as-is + ((js2-node-top-level-decl-p head) + (push chain result)) + ;; check for a this-reference + ((eq (js2-node-type head) js2-THIS) + (setq fn (js2-node-parent-script-or-fn head)) + ;; if there is no parent function, or if the parent function + ;; is nested, discard the head node and keep the rest of the chain. + (if (or (null fn) (js2-nested-function-p fn)) + (push (cdr chain) result) + ;; else look up parent in function-map. If not found, discard chain. + (when (setq parent-chain (and js2-imenu-function-map + (gethash fn js2-imenu-function-map))) + ;; else discard head node and prefix parent fn qname, which is + ;; the parent-chain sans tail, to this chain. + (push (append (butlast parent-chain) (cdr chain)) result)))))) + ;; finally replace each node in each chain with its name. + (dolist (chain result) + (setq p chain) + (while p + (if (js2-node-p (setq elem (car p))) + (setcar p (js2-node-qname-component elem))) + (setq p (cdr p)))) + result)) + +;; Merge name chains into a trie-like tree structure of nested lists. +;; To simplify construction of the trie, we first build it out using the rule +;; that the trie consists of lists of pairs. Each pair is a 2-element array: +;; [key, num-or-list]. The second element can be a number; if so, this key +;; is a leaf-node with only one value. (I.e. there is only one declaration +;; associated with the key at this level.) Otherwise the second element is +;; a list of pairs, with the rule applied recursively. This symmetry permits +;; a simple recursive formulation. +;; +;; js2-mode is building the data structure for imenu. The imenu documentation +;; claims that it's the structure above, but in practice it wants the children +;; at the same list level as the key for that level, which is how I've drawn +;; the "Expected final result" above. We'll postprocess the trie to remove the +;; list wrapper around the children at each level. +;; +;; A completed nested imenu-alist entry looks like this: +;; '(("foo" +;; ("" . 7) +;; ("bar" +;; ("a" . 40) +;; ("b" . 60)))) +;; +;; In particular, the documentation for `imenu--index-alist' says that +;; a nested sub-alist element looks like (INDEX-NAME SUB-ALIST). +;; The sub-alist entries immediately follow INDEX-NAME, the head of the list. + +(defsubst js2-treeify (lst) + "Convert (a b c d) to (a ((b ((c d)))))" + (if (null (cddr lst)) ; list length <= 2 + lst + (list (car lst) (list (js2-treeify (cdr lst)))))) + +(defun js2-build-alist-trie (chains trie) + "Merge declaration name chains into a trie-like alist structure for imenu. +CHAINS is the qname chain list produced during parsing. TRIE is a +list of elements built up so far." + (let (head tail pos branch kids) + (dolist (chain chains) + (setq head (car chain) + tail (cdr chain) + pos (if (numberp (car tail)) (car tail)) + branch (js2-find-if (lambda (n) + (string= (car n) head)) + trie) + kids (second branch)) + (cond + ;; case 1: this key isn't in the trie yet + ((null branch) + (if trie + (setcdr (last trie) (list (js2-treeify chain))) + (setq trie (list (js2-treeify chain))))) + + ;; case 2: key is present with a single number entry: replace w/ list + ;; ("a1" 10) + ("a1" 20) => ("a1" (("" 10) + ;; ("" 20))) + ((numberp kids) + (setcar (cdr branch) + (list (list "" kids) + (if pos + (list "" pos) + (js2-treeify tail))))) + + ;; case 3: key is there (with kids), and we're a number entry + (pos + (setcdr (last kids) + (list + (list (format "" + (1+ (loop for kid in kids + count (eq ?< (aref (car kid) 0))))) + pos)))) + + ;; case 4: key is there with kids, need to merge in our chain + (t + (js2-build-alist-trie (list tail) kids)))) + trie)) + +(defun js2-flatten-trie (trie) + "Convert TRIE to imenu-format. +Recurses through nodes, and for each one whose second element is a list, +appends the list's flattened elements to the current element. Also +changes the tails into conses. For instance, this pre-flattened trie + +'(a ((b 20) + (c ((d 30) + (e 40))))) + +becomes + +'(a (b . 20) + (c (d . 30) + (e . 40))) + +Note that the root of the trie has no key, just a list of chains. +This is also true for the value of any key with multiple children, +e.g. key 'c' in the example above." + (cond + ((listp (car trie)) + (mapcar #'js2-flatten-trie trie)) + (t + (if (numberp (second trie)) + (cons (car trie) (second trie)) + ;; else pop list and append its kids + (apply #'append (list (car trie)) (js2-flatten-trie (cdr trie))))))) + +(defun js2-build-imenu-index () + "Turn `js2-imenu-recorder' into an imenu data structure." + (let* ((chains (js2-browse-postprocess-chains js2-imenu-recorder)) + (result (js2-build-alist-trie chains nil))) + (js2-flatten-trie result))) + +(defun js2-test-print-chains (chains) + "Print a list of qname chains. +Each element of CHAINS is a list of the form (NODE [NODE *] pos); +i.e. one or more nodes, and an integer position as the list tail." + (mapconcat (lambda (chain) + (concat "(" + (mapconcat (lambda (elem) + (if (js2-node-p elem) + (or (js2-node-qname-component elem) + "nil") + (number-to-string elem))) + chain + " ") + ")")) + chains + "\n")) + + +(provide 'js2-browse) + +;;; js2-browse.el ends here +;;; js2-parse.el --- JavaScript parser + +;; Author: Steve Yegge (steve.yegge@gmail.com) +;; Keywords: javascript languages + +;; Commentary: + +;; This is based on Rhino's parser and tries to follow its code +;; structure as closely as practical, so that changes to the Rhino +;; parser can easily be propagated into this code. However, Rhino +;; does not currently generate a usable AST representation, at least +;; from an IDE perspective, so we build our own more suitable AST. + +;; The AST node structures are defined in `js2-ast.el'. +;; Every parser function that creates and returns an AST node has +;; the following responsibilities: + +;; 1) set the node start to the absolute buffer start position +;; 2) set the node length to include any closing chars (RC, SEMI) +;; 3) fix up any child-node starts to be relative to this node +;; 4) set any field positions (e.g. keywords) relative to this node +;; 5) report any child nodes with `js2-node-add-children' +;; (note that this call fixes up start positions by default) + +;; The resulting AST has all node start positions relative to the +;; parent nodes; only the root has an absolute start position. + +;; Note: fontification is done inline while parsing. It used to be +;; done in a second pass over the AST, but doing it inline is about +;; twice as fast. Most of the fontification happens when tokens are +;; scanned, and the parser has a few spots that perform extra +;; fontification. In addition to speed, a second benefit of inline +;; parsing is that if a long parse is interrupted, everything parsed +;; so far is still fontified. + +;; The editing mode that uses this parser, `js2-mode', directs the +;; parser to check periodically for user input. If user input +;; arrives, the parse is abandoned, except for the highlighting that +;; has occurred so far, and a re-parse is rescheduled for when Emacs +;; becomes idle again. This works pretty well, but could be better. +;; In particular, when the user input has not resulted in changes to +;; the buffer (for instance, navigation input), the parse tree built +;; so far should not be discarded, and the parse should continue where +;; it left off. It will be some work to create what amounts to a +;; continuation, but it should not be unreasonably difficult. + +;; TODO: +;; - make non-editing input restart parse at previous continuation +;; - in Eclipse, sibling nodes never overlap start/end ranges +;; - for getters, prop name and function nodes overlap +;; - should write a debug tree visitor to look for overlaps +;; - mark array and object literals as "destructuring" (node prop?) +;; so we can syntax-highlight them properly. +;; - figure out a way not to store value in string/name nodes +;; - needs a solution for synthetic nodes + +;;; Code + +(eval-and-compile + (require 'cl)) ; for delete-if + + +(defconst js2-version "1.7.0" + "Version of JavaScript supported, plus minor js2 version.") + +(defsubst js2-record-comment () + (push (make-js2-comment-node :len (- js2-token-end js2-token-beg) + :format js2-ts-comment-type) + js2-scanned-comments) + (when js2-parse-ide-mode + (js2-set-face js2-token-beg js2-token-end 'font-lock-comment-face 'record) + (when (memq js2-ts-comment-type '(html preprocessor)) + ;; Tell cc-engine the bounds of the comment. + (put-text-property js2-token-beg (1- js2-token-end) 'c-in-sws t)))) + +(defsubst js2-node-end (n) + "Computes the absolute end of node N. +Use with caution! Assumes `js2-node-pos' is -absolute-, which +is only true until the node is added to its parent." + (+ (js2-node-pos n) + (js2-node-len n))) + +;; This function is called depressingly often, so it should be fast. +;; Most of the time it's looking at the same token it peeked before. +(defsubst js2-peek-token () + "Returns the next token without consuming it. +If previous token was consumed, calls scanner to get new token. +If previous token was -not- consumed, returns it (idempotent). + +This function will not return a newline (js2-EOL) - instead, it +gobbles newlines until it finds a non-newline token, and flags +that token as appearing just after a newline. + +This function will also not return a js2-COMMENT. Instead, it +records comments found in `js2-scanned-comments'. If the token +returned by this function immediately follows a jsdoc comment, +the token is flagged as such. + +Note that this function always returned the un-flagged token! +The flags, if any, are saved in `js2-current-flagged-token'." + (if (/= js2-current-flagged-token js2-EOF) ; last token not consumed + js2-current-token ; most common case - return already-peeked token + (let ((tt (js2-get-token)) ; call scanner + saw-comment + saw-eol + flags + face) + ;; process comments and whitespace + (while (or (eq tt js2-EOL) + (eq tt js2-COMMENT)) + (if (eq tt js2-EOL) + (setq saw-eol t) + ;; this is sticky - subsequent whitespace doesn't affect + ;; the fact that we saw a comment. + (setq saw-comment t + saw-eol nil) + (if js2-record-comments + (js2-record-comment))) + (setq tt (js2-get-token))) ; call scanner + + (setq js2-current-token tt + js2-current-flagged-token (set-flag tt + (logior (if saw-eol + js2-ti-after-eol + 0) + (if saw-comment + js2-ti-after-comment + 0)))) + ;; perform lexical fontification as soon as token is scanned + (when js2-parse-ide-mode + (cond + ((minusp tt) + (js2-set-face js2-token-beg js2-token-end 'js2-error-face 'record)) + ((setq face (aref js2-kwd-tokens tt)) + (js2-set-face js2-token-beg js2-token-end face 'record)) + ((and (eq tt js2-NAME) + (equal js2-ts-string "undefined")) + (js2-set-face js2-token-beg js2-token-end 'font-lock-constant-face 'record)))) + tt))) ; return unflagged token + +(defsubst js2-peek-flagged-token () + "Returns the current token along with any flags set for it." + (js2-peek-token) + js2-current-flagged-token) + +(defsubst js2-consume-token () + (setq js2-current-flagged-token js2-EOF)) + +(defsubst js2-next-token () + (prog1 + (js2-peek-token) + (js2-consume-token))) + +(defsubst js2-next-flagged-token () + (js2-peek-token) + (prog1 js2-current-flagged-token + (js2-consume-token))) + +(defsubst js2-match-token (match) + "Consume and return t if next token matches MATCH, a bytecode. +Returns nil and consumes nothing if MATCH is not the next token." + (if (neq (js2-peek-token) match) + nil + (js2-consume-token) + t)) + +(defsubst js2-valid-prop-name-token (tt) + (or (eq tt js2-NAME) + (and js2-allow-keywords-as-property-names + (plusp tt) + (aref js2-kwd-tokens tt)))) + +(defsubst js2-match-prop-name () + "Consume token and return t if next token is a valid property name. +It's valid if it's a js2-NAME, or `js2-allow-keywords-as-property-names' +is non-nil and it's a keyword token." + (if (js2-valid-prop-name-token (js2-peek-token)) + (progn + (js2-consume-token) + t) + nil)) + +(defsubst js2-must-match-prop-name (msg-id &optional pos len) + (if (js2-match-prop-name) + t + (js2-report-error msg-id pos len) + nil)) + +(defsubst js2-peek-token-or-eol () + "Return js2-EOL if the current token immediately follows a newline. +Else returns the current token. Used in situations where we don't +consider certain token types valid if they are preceded by a newline. +One example is the postfix ++ or -- operator, which has to be on the +same line as its operand." + (let ((tt (js2-peek-token))) + ;; Check for last peeked token flags + (if (/= 0 (logand js2-current-flagged-token js2-ti-after-eol)) + js2-EOL + tt))) + +(defsubst js2-set-check-for-label () + (if (/= (logand js2-current-flagged-token js2-clear-ti-mask) js2-NAME) + (js2-code-bug)) + (setq js2-current-flagged-token + (set-flag js2-current-flagged-token js2-ti-check-label))) + +(defsubst js2-must-match (token msg-id &optional pos len) + "Match next token to token code TOKEN, or record a syntax error. +MSG-ID is the error message to report if the match fails. +Returns t on match, nil if no match." + (if (js2-match-token token) + t + (js2-report-error msg-id nil pos len) + nil)) + +(defsubst js2-set-requires-activation () + (if (js2-function-node-p js2-current-script-or-fn) + (setf (js2-function-node-needs-activation js2-current-script-or-fn) t))) + +(defsubst js2-set-is-generator () + (if (js2-function-node-p js2-current-script-or-fn) + (setf (js2-function-node-is-generator js2-current-script-or-fn) t))) + +(defsubst js2-must-have-xml () + (unless js2-compiler-xml-available + (js2-report-error "msg.XML.not.available"))) + +(defsubst js2-inside-function () + (/= 0 js2-nesting-of-function)) + +(defsubst js2-push-scope (node) + "Push `js2-scope' associated with NODE, a `js2-node'. +NODE must either be a scope node supported by `js2-node-scope' +or a `js2-scope' itself." + (unless (js2-scope-p node) + (setq node (js2-node-scope node))) + (if (js2-scope-parent node) + (js2-code-bug)) + (if (eq js2-current-scope node) + (js2-code-bug)) + (setf (js2-scope-parent node) js2-current-scope + js2-current-scope node)) + +(defsubst js2-pop-scope () + (setq js2-current-scope + (js2-scope-parent js2-current-scope))) + +(defsubst js2-enter-loop (loop-node) + (push loop-node js2-loop-set) + (push loop-node js2-loop-and-switch-set) + (setf (js2-loop-node-scope loop-node) + (make-js2-scope :type js2-LOOP + :ast-node loop-node)) + (js2-push-scope loop-node)) + +(defsubst js2-exit-loop () + (setq js2-loop-set (cdr js2-loop-set)) + (setq js2-loop-and-switch-set (cdr js2-loop-and-switch-set)) + (js2-pop-scope)) + +(defsubst js2-enter-switch (switch-node) + (push switch-node js2-loop-and-switch-set)) + +(defsubst js2-exit-switch () + (pop js2-loop-and-switch-set)) + +(defun js2-parse (&optional buf cb) + "Tells the js2 parser to parse a region of JavaScript. + +BUF is a buffer or buffer name containing the code to parse. +Call `narrow-to-region' first to parse only part of the buffer. + +The returned AST root node is given some additional properties: + `node-count' - total number of nodes in the AST + `buffer' - BUF. The buffer it refers to may change or be killed, + so the value is not necessarily reliable. + +An optional callback CB can be specified to report parsing +progress. If `(functionp CB)' returns t, it will be called with +the current line number once before parsing begins, then again +each time the lexer reaches a new line number. + +CB can also be a list of the form `(symbol cb ...)' to specify +multiple callbacks with different criteria. Each symbol is a +criterion keyword, and the following element is the callback to +call + + :line - called whenever the line number changes + :token - called for each new token consumed + +The list of criteria could be extended to include entering or +leaving a statement, an expression, or a function definition." + (if (and cb (not (functionp cb))) + (error "criteria callbacks not yet implemented")) + (let ((inhibit-point-motion-hooks t) + (js2-compiler-xml-available (>= js2-language-version 160)) + ;; This is a recursive-descent parser, so give it a big stack. + (max-lisp-eval-depth (max max-lisp-eval-depth 3000)) + (max-specpdl-size (max max-specpdl-size 3000)) + (case-fold-search nil) + ast) + (or buf (setq buf (current-buffer))) + (setq js2-scanned-comments nil + js2-parsed-errors nil + js2-parsed-warnings nil + js2-imenu-recorder nil + js2-imenu-function-map nil) + (save-excursion + (set-buffer buf) + (js2-init-scanner) + (setq ast (js2-with-unmodifying-text-property-changes + (js2-do-parse))) + (unless js2-ts-hit-eof + (js2-report-error "msg.syntax")) + (setf (js2-ast-root-errors ast) js2-parsed-errors + (js2-ast-root-warnings ast) js2-parsed-warnings) + (if (>= js2-highlight-level 1) + (js2-highlight-jsdoc ast)) + (run-hooks 'js2-parse-finished-hook) + ast))) + +;; Corresponds to Rhino's Parser.parse() method. +(defun js2-do-parse () + "Parse current buffer starting from current point. +Scanner should be initialized." + (let ((pos js2-ts-cursor) + root + n + tt + msg + (end js2-ts-cursor)) ; in case file is empty + ;; initialize buffer-local vars + (setf root (make-js2-ast-root :buffer (buffer-name) + :pos js2-ts-cursor) + js2-current-script-or-fn root + js2-current-scope (js2-node-set-scope + root + (make-js2-scope :type js2-SCRIPT + :ast-node root)) + js2-current-flagged-token js2-EOF + js2-nesting-of-function 0 + js2-statement-label nil + js2-recorded-assignments nil) + (catch 'break + (while t + (setq tt (js2-peek-token)) + (if (= tt js2-EOF) + (throw 'break nil)) + (if (eq tt js2-FUNCTION) + (progn + (js2-consume-token) + (setq n (js2-parse-function + (if js2-called-by-compile-function + 'FUNCTION_EXPRESSION + 'FUNCTION_STATEMENT))) + (js2-record-imenu-functions n)) + ;; not a function - parse a statement + (setq n (js2-parse-statement))) + ;; add to script + (setq end (js2-node-end n)) + (js2-block-node-push root n))) + (setf (js2-node-pos root) pos + (js2-node-len root) (- end pos)) + (js2-highlight-undeclared-vars) + ;; add comments to root in lexical order + (when js2-scanned-comments + ;; if we find a comment beyond end of normal kids, use its end + (setq end (max end (js2-node-end (first js2-scanned-comments)))) + (dolist (comment js2-scanned-comments) + (push comment (js2-ast-root-comments root)) + (js2-node-add-children root comment)) + (setf (js2-node-len root) (- end pos))) + root)) + +(defun js2-parse-function-body () + (incf js2-nesting-of-function) + (let ((pn (make-js2-block-node)) ; starts at LC position + n + tt) + (unwind-protect + (catch 'break-loop + (while t + (setq tt (js2-peek-token)) + (cond + ((or (eq tt js2-ERROR) + (eq tt js2-EOF) + (eq tt js2-RC)) + (throw 'break-loop nil)) + ((eq tt js2-FUNCTION) + (js2-consume-token) + (setq n (js2-parse-function 'FUNCTION_STATEMENT))) + (t + (setq n (js2-parse-statement)))) + (js2-block-node-push pn n))) + (decf js2-nesting-of-function)) + pn)) + +(defun js2-function-parser () + (js2-consume-token) + (js2-parse-function 'FUNCTION_EXPRESSION_STATEMENT)) + +;; The function parser is simpler than Rhino's. It doesn't define +;; symbols, doesn't support the experimental member-expr syntax, +;; doesn't do tree-rewriting for destructuring assignment, and doesn't +;; keep track of dynamic scope. That stuff can (and should) be done +;; in a separate codegen pass. Parsing is already hairy enough. + +(defun js2-parse-function (function-type) + "Function parser. FUNCTION-TYPE is a symbol." + (let ((pos js2-token-beg) + name + fn-node + function-index + saved-script-or-fn + saved-current-scope + saved-nesting-of-with + saved-label-set + saved-loop-set + saved-loop-and-switch-set + saved-end-flags + body + n + n2 + pos2 + len + tt + params + scope + lp) + (when (js2-match-token js2-NAME) + (js2-set-face js2-token-beg js2-token-end 'font-lock-function-name-face 'record) + (setq name (make-js2-name-node :pos js2-token-beg + :len (- js2-token-end js2-token-beg)))) + (if (js2-must-match js2-LP "msg.no.paren.parms") + (setq lp js2-token-beg)) + + (setf fn-node (make-js2-function-node :pos pos + :name name + :form function-type + :lp (if lp (- lp pos)))) + + (if (and name (neq function-type 'FUNCTION_EXPRESSION)) + ;; Function statements define a symbol in the enclosing scope + (js2-define-symbol js2-FUNCTION (js2-name-node-name name) fn-node)) + + (setf scope (make-js2-scope :type js2-FUNCTION + :ast-node fn-node) + (js2-function-node-scope fn-node) scope + saved-script-or-fn js2-current-script-or-fn + js2-current-script-or-fn fn-node + saved-current-scope js2-current-scope + js2-current-scope scope + saved-nesting-of-with js2-nesting-of-with + js2-nesting-of-with 0 + saved-label-set js2-label-set + js2-label-set nil + saved-loop-set js2-loop-set + js2-loop-set nil + saved-loop-and-switch-set js2-loop-and-switch-set + js2-loop-and-switch-set nil + saved-end-flags js2-end-flags + js2-end-flags 0) + (unwind-protect + (progn + ;; parse function parameter list + (if (js2-match-token js2-RP) + (setf (js2-function-node-rp fn-node) (- js2-token-beg pos)) + (loop + do + (setq tt (js2-peek-token)) + ;; Rhino does some tree rewriting to support destructuring + ;; assignment; we'll do that later during codegen, and just + ;; create array-literal or object-literal nodes for any + ;; destructuring-assignment parameters we find. + (cond + ((eq tt js2-LB) + (js2-consume-token) + (push (js2-parse-array-literal) params)) + ((eq tt js2-LC) + (js2-consume-token) + (push (js2-parse-object-literal) params)) + (t + (js2-must-match js2-NAME "msg.no.parm") + (js2-set-face js2-token-beg js2-token-end + 'js2-function-param-face 'record) + (setq pos2 js2-token-beg + len (- js2-token-end js2-token-beg) + n (make-js2-name-node :pos pos2 + :len len) + n2 (make-js2-function-arg-node :pos pos2 + :len len + :value n)) + (js2-define-symbol js2-LP js2-ts-string n2) + (js2-node-add-children n2 n) + (push n2 params))) + while + (js2-match-token js2-COMMA)) + (if (js2-must-match js2-RP "msg.no.paren.after.parms") + (setf (js2-function-node-rp fn-node) (- js2-token-beg pos)))) + (dolist (p params) + (js2-node-add-children fn-node p) + (push p (js2-function-node-params fn-node))) + ;; parse function body + (js2-must-match js2-LC "msg.no.brace.body") + (setf pos2 js2-token-beg + body (js2-parse-function-body) + (js2-node-pos body) pos2 + (js2-node-len body) (- js2-ts-cursor pos2) + (js2-function-node-body fn-node) body) + (js2-node-add-children fn-node body) + (js2-must-match js2-RC "msg.no.brace.after.body" pos2) + + (if (and name + (eq function-type 'FUNCTION_EXPRESSION) + (null (js2-scope-get-symbol js2-current-scope + (js2-name-node-name name)))) + ;; Function expressions define a name only in the body of the + ;; function, and only if not hidden by a parameter name + (js2-define-symbol js2-FUNCTION + (js2-name-node-name name) + fn-node)) + (if (and name + (eq function-type 'FUNCTION_EXPRESSION_STATEMENT)) + (js2-record-imenu-functions fn-node))) + + ;; finally + (setq js2-end-flags saved-end-flags + js2-loop-and-switch-set saved-loop-and-switch-set + js2-loop-set saved-loop-set + js2-label-set saved-label-set + js2-nesting-of-with saved-nesting-of-with + js2-current-script-or-fn saved-script-or-fn + js2-current-scope saved-current-scope)) + + (setf (js2-node-len fn-node) (- js2-ts-cursor pos)) + (js2-node-add-children fn-node name) + + ;; Rhino doesn't do this, but we need it for finding undeclared vars. + ;; We wait until after parsing the function to set its parent scope, + ;; since `js2-define-symbol' needs the defining-scope check to stop + ;; at the function boundary when checking for redeclarations. + (setf (js2-scope-parent scope) js2-current-scope) + + fn-node)) + +(defun js2-parse-statements (&optional parent) + "Parse a statement list. Last token consumed must be js2-LC. + +PARENT can be a `js2-block-node', in which case the statements are +appended to PARENT. Otherwise a new `js2-block-node' is created +and returned. + +This function does not match the closing js2-RC: the caller +matches the RC so it can provide a suitable error message if not +matched. This means it's up to the caller to set the length of +the node to include the closing RC. The node start pos is set to +the absolute buffer start position, and the caller should fix it +up to be relative to the parent node. All children of this block +node are given relative start positions and correct lengths." + (let ((pn (or (and parent + (prog1 parent + (setf (js2-node-pos parent) js2-token-beg))) + (make-js2-block-node))) + stmt + tt) + (while (and (> (setq tt (js2-peek-token)) js2-EOF) + (neq tt js2-RC)) + (setq stmt (js2-parse-statement)) + (js2-block-node-push pn stmt)) + pn)) + +(defun js2-parse-condition () + "Parse a parenthesized boolean expression, e.g. in an if- or while-stmt. +The parens are discarded and the expression node is returned. +The `pos' field of the return value is set to an absolute position +that must be fixed up by the caller. +Return value is a list (EXPR LP RP), with absolute paren positions." + (let (pn lp rp) + (if (js2-must-match js2-LP "msg.no.paren.cond") + (setq lp js2-token-beg)) + (setq pn (js2-parse-expr)) + (if (js2-must-match js2-RP "msg.no.paren.after.cond") + (setq rp js2-token-beg)) + ;; Report strict warning on code like "if (a = 7) ..." + (if (and (boundp 'js2-strict-cond-assign-warning) + js2-strict-cond-assign-warning + (js2-assign-node-p pn)) + (js2-add-strict-warning "msg.equal.as.assign" nil + (js2-node-pos pn) + (+ (js2-node-pos pn) + (js2-node-len pn)))) + (list pn lp rp))) + +(defun js2-parse-statement () + (let ((js2-statement-label nil) + tt pn beg end) + (when js2-parse-interruptable-p + (if (zerop (% (incf js2-parse-stmt-count) + js2-statements-per-pause)) + (if (input-pending-p) + (throw 'interrupted t)))) + (setq pn (js2-statement-helper)) + (unless (js2-node-has-side-effects pn) + (setq end (js2-node-end pn)) + (save-excursion + (goto-char end) + (setq beg (max (js2-node-pos pn) (point-at-bol)))) + (js2-add-strict-warning "msg.no.side.effects" nil beg end)) + pn)) + +;; These correspond to the switch cases in Parser.statementHelper +(defconst js2-parsers + (let ((parsers (make-vector js2-num-tokens + #'js2-parse-expr-stmt))) + (aset parsers js2-BREAK #'js2-parse-break) + (aset parsers js2-CONST #'js2-parse-const-var) + (aset parsers js2-CONTINUE #'js2-parse-continue) + (aset parsers js2-DEBUGGER #'js2-parse-debugger) + (aset parsers js2-DEFAULT #'js2-parse-default-xml-namespace) + (aset parsers js2-DO #'js2-parse-do) + (aset parsers js2-FOR #'js2-parse-for) + (aset parsers js2-FUNCTION #'js2-function-parser) + (aset parsers js2-IF #'js2-parse-if) + (aset parsers js2-LC #'js2-parse-block) + (aset parsers js2-LET #'js2-parse-let) + (aset parsers js2-NAME #'js2-parse-name) + (aset parsers js2-RETURN #'js2-parse-ret-yield) + (aset parsers js2-SEMI #'js2-parse-semi) + (aset parsers js2-SWITCH #'js2-parse-switch) + (aset parsers js2-THROW #'js2-parse-throw) + (aset parsers js2-TRY #'js2-parse-try) + (aset parsers js2-VAR #'js2-parse-const-var) + (aset parsers js2-WHILE #'js2-parse-while) + (aset parsers js2-WITH #'js2-parse-with) + (aset parsers js2-YIELD #'js2-parse-ret-yield) + parsers) + "A vector mapping token types to parser functions.") + +(defsubst js2-parse-warn-missing-semi (beg end) + (and js2-mode-show-strict-warnings + js2-strict-missing-semi-warning + (not (and js2-missing-semi-one-line-override + (save-excursion + (goto-char beg) + (skip-chars-backward " \t") + (eq (char-before) ?{)) + (save-excursion + (goto-char end) + (skip-chars-forward " \t") + (eq (char-after) ?})))) + (js2-add-strict-warning + "msg.missing.semi" nil + ;; back up to beginning of statement or line + (max beg (save-excursion + (goto-char end) + (point-at-bol))) + end))) + +(defconst js2-no-semi-insertion + (list js2-IF + js2-SWITCH + js2-WHILE + js2-DO + js2-FOR + js2-TRY + js2-WITH + js2-LC + js2-ERROR + js2-SEMI + js2-FUNCTION) + "List of tokens that don't do automatic semicolon insertion.") + +(defun js2-statement-helper () + (let* ((tt (js2-peek-token)) + (first-tt tt) + (parser (if (eq tt js2-ERROR) + #'js2-parse-semi + (aref js2-parsers tt))) + pn + (beg js2-token-beg) + tt-flagged) + + (setq pn (funcall parser) + tt-flagged (js2-peek-flagged-token) + tt (logand tt-flagged js2-clear-ti-mask)) + + ;; Don't do auto semi insertion for certain statement types. + (unless (or (memq first-tt js2-no-semi-insertion) + ;; check for labeled statement + (js2-labeled-stmt-node-p pn)) + (cond + ((eq tt js2-SEMI) + ;; Consume ';' as a part of expression + (js2-consume-token) + ;; extend the node bounds to include the semicolon. + (setf (js2-node-len pn) (- js2-token-end beg))) + ((memq tt (list js2-ERROR js2-EOF js2-RC)) + ;; Autoinsert ; + (js2-parse-warn-missing-semi beg (js2-node-end pn))) + (t + (if (zerop (logand tt-flagged js2-ti-after-eol)) + ;; Report error if no EOL or autoinsert ';' otherwise + (js2-report-error "msg.no.semi.stmt") + (js2-parse-warn-missing-semi beg (js2-node-end pn)))))) + pn)) + +(defun js2-parse-if () + "Parser for if-statement. Last matched token must be js2-IF." + (let ((pos js2-token-beg) + cond + if-true + if-false + else-pos + end + pn) + (js2-consume-token) + (setq cond (js2-parse-condition) + if-true (js2-parse-statement) + if-false (if (js2-match-token js2-ELSE) + (progn + (setq else-pos (- js2-token-beg pos)) + (js2-parse-statement))) + end (js2-node-end (or if-false if-true)) + pn (make-js2-if-node :pos pos + :len (- end pos) + :condition (car cond) + :then-part if-true + :else-part if-false + :else-pos else-pos + :lp (js2-relpos (second cond) pos) + :rp (js2-relpos (third cond) pos))) + (js2-node-add-children pn (car cond) if-true if-false) + pn)) + +(defun js2-parse-switch () + "Parser for if-statement. Last matched token must be js2-SWITCH." + (let ((pos js2-token-beg) + tt + pn + discriminant + has-default + case-expr + case-node + case-pos + cases + stmt + lp + rp) + (js2-consume-token) + (if (js2-must-match js2-LP "msg.no.paren.switch") + (setq lp js2-token-beg)) + (setq discriminant (js2-parse-expr) + pn (make-js2-switch-node :discriminant discriminant + :pos pos + :lp (js2-relpos lp pos))) + (js2-node-add-children pn discriminant) + (js2-enter-switch pn) + (unwind-protect + (progn + (if (js2-must-match js2-RP "msg.no.paren.after.switch") + (setf (js2-switch-node-rp pn) (- js2-token-beg pos))) + (js2-must-match js2-LC "msg.no.brace.switch") + (catch 'break + (while t + (setq tt (js2-next-token) + case-pos js2-token-beg) + (cond + ((eq tt js2-RC) + (setf (js2-node-len pn) (- js2-token-end pos)) + (throw 'break nil)) ; done + + ((eq tt js2-CASE) + (setq case-expr (js2-parse-expr)) + (js2-must-match js2-COLON "msg.no.colon.case")) + + ((eq tt js2-DEFAULT) + (if has-default + (js2-report-error "msg.double.switch.default")) + (setq has-default t + case-expr nil) + (js2-must-match js2-COLON "msg.no.colon.case")) + + (t + (js2-report-error "msg.bad.switch") + (throw 'break nil))) + + (setq case-node (make-js2-case-node :pos case-pos + :expr case-expr)) + (js2-node-add-children case-node case-expr) + (setf (js2-node-len case-node) (- js2-token-end case-pos)) + (while (and (neq (setq tt (js2-peek-token)) js2-RC) + (neq tt js2-CASE) + (neq tt js2-DEFAULT) + (neq tt js2-EOF)) + (setf stmt (js2-parse-statement) + (js2-node-len case-node) (- (js2-node-end stmt) case-pos)) + (js2-block-node-push case-node stmt)) + (push case-node cases))) + (dolist (kid cases) + (js2-node-add-children pn kid) + (push kid (js2-switch-node-cases pn))) + pn) ; return value + (js2-exit-switch)))) + +(defun js2-parse-while () + "Parser for while-statement. Last matched token must be js2-WHILE." + (let ((pos js2-token-beg) + (pn (make-js2-while-node)) + cond + body) + (js2-consume-token) + (js2-enter-loop pn) + (unwind-protect + (progn + (setf cond (js2-parse-condition) + (js2-while-node-condition pn) (car cond) + body (js2-parse-statement) + (js2-while-node-body pn) body + (js2-node-len pn) (- (js2-node-end body) pos) + (js2-while-node-label pn) js2-statement-label + (js2-while-node-lp pn) (js2-relpos (second cond) pos) + (js2-while-node-rp pn) (js2-relpos (third cond) pos)) + (js2-node-add-children pn body (car cond))) + (js2-exit-loop)) + pn)) + +(defun js2-parse-do () + "Parser for do-statement. Last matched token must be js2-DO." + (let ((pos js2-token-beg) + (pn (make-js2-do-node)) + cond + body + end) + (js2-consume-token) + (js2-enter-loop pn) + (unwind-protect + (progn + (setq body (js2-parse-statement)) + (js2-must-match js2-WHILE "msg.no.while.do") + (setf (js2-do-node-while-pos pn) (- js2-token-beg pos) + cond (js2-parse-condition) + (js2-do-node-condition pn) (car cond) + (js2-do-node-body pn) body + end js2-ts-cursor + (js2-do-node-label pn) js2-statement-label + (js2-do-node-lp pn) (js2-relpos (second cond) pos) + (js2-do-node-rp pn) (js2-relpos (third cond) pos)) + (js2-node-add-children pn (car cond) body)) + (js2-exit-loop)) + ;; Always auto-insert semicolon to follow SpiderMonkey: + ;; It is required by ECMAScript but is ignored by the rest of + ;; world, see bug 238945 + (if (js2-match-token js2-SEMI) + (setq end js2-ts-cursor)) + (setf (js2-node-len pn) (- end pos)) + pn)) + +(defun js2-parse-for () + "Parser for for-statement. Last matched token must be js2-FOR. +Parses for, for-in, and for each-in statements." + (let ((for-pos js2-token-beg) + let-pos + pn + is-for-each + is-for-in + in-pos + each-pos + init ; Node init is also foo in 'foo in object' + cond ; Node cond is also object in 'foo in object' + incr ; 3rd section of for-loop initializer + body + end + tt + expr + lp + rp) + (js2-consume-token) + ;; See if this is a for each () instead of just a for () + (when (js2-match-token js2-NAME) + (if (string= "each" js2-ts-string) + (setq is-for-each t + each-pos (- js2-token-beg for-pos)) ; relative + (js2-report-error "msg.no.paren.for"))) + + (if (js2-must-match js2-LP "msg.no.paren.for") + (setq lp (- js2-token-beg for-pos))) + (setq tt (js2-peek-token)) + + ;; parse init clause + (let ((js2-in-for-init t)) ; set as dynamic variable + (if (eq tt js2-SEMI) + (setq init (make-js2-empty-expr-node)) + (if (or (eq tt js2-VAR) (eq tt js2-LET)) + (progn + (js2-consume-token) + (setq let-pos js2-token-beg + expr (js2-parse-variables tt)) + (if (eq tt js2-VAR) + (setq init expr) + (prog1 + (setq init + (make-js2-let-expr-node :pos let-pos + :len (- (js2-node-end expr) + let-pos) + :vars expr)) + (js2-node-add-children init expr)))) + (setq init (js2-parse-expr))))) + + (if (js2-match-token js2-IN) + ;; 'cond' is the object over which we're iterating + (setq is-for-in t + in-pos (- js2-token-beg for-pos) + cond (js2-parse-expr)) + ;; else ordinary for loop - parse cond and incr + (js2-must-match js2-SEMI "msg.no.semi.for") + (setq cond (if (eq (js2-peek-token) js2-SEMI) + (make-js2-empty-expr-node) ; no loop condition + (js2-parse-expr))) + (js2-must-match js2-SEMI "msg.no.semi.for.cond") + (setq incr (if (eq (js2-peek-token) js2-RP) + (make-js2-empty-expr-node) + (js2-parse-expr)))) + + (if (js2-must-match js2-RP "msg.no.paren.for.ctrl") + (setq rp (- js2-token-beg for-pos))) + (if (not is-for-in) + (setq pn (make-js2-for-node :init init + :condition cond + :update incr + :lp lp + :rp rp)) + ;; cond could be null if 'in obj' got eaten by the init node. + (when (null cond) + (setq cond (js2-infix-node-right init) + init (js2-infix-node-left init))) + + ;; TODO: fix let-node and then check kids for it here + (if (and (eq (setq tt (js2-node-type init)) js2-VAR) + (> (length (js2-var-decl-node-kids init)) 1)) + (js2-report-error "msg.mult.index")) + + (setq pn (make-js2-for-in-node :iterator init + :object cond + :in-pos in-pos + :foreach-p is-for-each + :each-pos each-pos + :lp lp + :rp rp))) + (unwind-protect + (progn + (js2-enter-loop pn) + ;; We have to parse the body -after- creating the loop node, + ;; so that the loop node appears in the js2-loop-set, allowing + ;; break/continue statements to find the enclosing loop. + (setf body (js2-parse-statement) + (js2-loop-node-label pn) js2-statement-label + (js2-loop-node-body pn) body + (js2-node-pos pn) for-pos + end (js2-node-end body) + (js2-node-len pn) (- end for-pos)) + (js2-node-add-children pn init cond incr body)) + ;; finally + (js2-exit-loop)) + pn)) + +(defun js2-parse-try () + "Parser for try-statement. Last matched token must be js2-TRY." + (let ((try-pos js2-token-beg) + try-end + try-block + catch-blocks + finally-block + saw-default-catch + peek + var-name + catch-cond + catch-node + guard-kwd + catch-pos + catch-end + pn + block + lp + rp) + (js2-consume-token) + (if (/= (js2-peek-token) js2-LC) + (js2-report-error "msg.no.brace.try")) + (setq try-block (js2-parse-statement) + peek (js2-peek-token)) + (cond + ((eq peek js2-CATCH) + (while (js2-match-token js2-CATCH) + (setq guard-kwd nil + catch-cond nil + catch-pos js2-token-beg) + (if saw-default-catch + (js2-report-error "msg.catch.unreachable")) + (if (js2-must-match js2-LP "msg.no.paren.catch") + (setq lp (- js2-token-beg catch-pos))) + (js2-must-match js2-NAME "msg.bad.catchcond") + (setq var-name (make-js2-name-node)) + (if (js2-match-token js2-IF) + (setq guard-kwd (- js2-token-beg catch-pos) + catch-cond (js2-parse-expr)) + (setq saw-default-catch t)) + (if (js2-must-match js2-RP "msg.bad.catchcond") + (setq rp (- js2-token-beg catch-pos))) + (js2-must-match js2-LC "msg.no.brace.catchblock") + (setq block (js2-parse-statements) + catch-end (js2-node-end block) + catch-node (make-js2-catch-node :var-name var-name + :guard-expr catch-cond + :guard-kwd guard-kwd + :pos catch-pos + :len (- catch-end catch-pos) + :block block + :lp lp + :rp rp)) + (if (js2-must-match js2-RC "msg.no.brace.after.body") + (setf catch-end js2-token-beg + (js2-node-len block) (- catch-end (js2-node-pos block)) + (js2-node-len catch-node) (- catch-end catch-pos))) + (js2-node-add-children catch-node + var-name + catch-cond + block) + (push catch-node catch-blocks) + (setf try-end js2-token-end + (js2-node-len catch-node) (- js2-ts-cursor catch-pos)))) + ((/= peek js2-FINALLY) + (js2-must-match js2-FINALLY "msg.try.no.catchfinally" + (js2-node-pos try-block) + (- (setq try-end (js2-node-end try-block)) + (js2-node-pos try-block))))) + + (when (js2-match-token js2-FINALLY) + (setq catch-pos js2-token-beg + block (js2-parse-statement) + try-end (js2-node-end block) + finally-block (make-js2-finally-node :pos catch-pos + :len (- try-end catch-pos) + :block block)) + (js2-node-add-children finally-block block)) + (setq pn (make-js2-try-node :pos try-pos + :len (- try-end try-pos) + :try-block try-block + :finally-block finally-block)) + (js2-node-add-children pn try-block finally-block) + (dolist (cb catch-blocks) + (js2-node-add-children pn cb) + (push cb (js2-try-node-catch-clauses pn))) + pn)) + +(defun js2-parse-throw () + "Parser for throw-statement. Last matched token must be js2-THROW." + (let ((pos js2-token-beg) + expr + node) + (js2-consume-token) + (if (eq (js2-peek-token-or-eol) js2-EOL) + ;; ECMAScript does not allow new lines before throw expression, + ;; see bug 256617 + (js2-report-error "msg.bad.throw.eol")) + (setq expr (js2-parse-expr) + node (make-js2-throw-node :pos pos + :len (- (js2-node-end expr) pos) + :expr expr)) + (js2-node-add-children node expr) + node)) + +(defsubst js2-match-jump-label-name () + "If we match a js2-NAME, return the labeled statement for that label. +If the name does not match an existing label, reports an error and returns nil. +Returns the `js2-labeled-stmt-node', or nil if the token was not a name. +Side effect: sets token information for the label identifier." + (let ((tt (js2-peek-token-or-eol)) + label + name) + (when (eq tt js2-NAME) + (js2-consume-token) + (setq name js2-ts-string + label (assoc name js2-label-set)) + (if (null label) + (progn + (js2-report-error "msg.undef.label") + nil) + label)))) + +(defun js2-parse-break () + "Parser for break-statement. Last matched token must be js2-BREAK." + (let ((pos js2-token-beg) + (end js2-token-end) + break-target ; statement to break from + break-label ; in "break foo", name-node representing the foo + break-node) + (js2-consume-token) + (if (eq (js2-peek-token-or-eol) js2-NAME) + (setq break-label (make-js2-name-node) + end (js2-node-end break-label))) + ;; matchJumpLabelName only matches if there is one + (unless (setq break-target (js2-match-jump-label-name)) + ;; no break target specified - try for innermost enclosing loop/switch + (if (null js2-loop-and-switch-set) + (js2-report-error "msg.bad.break" nil pos (length "break")) + (setq break-target (first js2-loop-and-switch-set)))) + (setq break-node (make-js2-break-node :pos pos + :len (- end pos) + :label break-label + :target break-target)) + (js2-node-add-children break-node break-label) + break-node)) + +(defun js2-parse-continue () + "Parser for continue-statement. Last matched token must be js2-CONTINUE." + (let ((pos js2-token-beg) + label ; optional user-specified label, a `js2-name-node' + target ; a `js2-loop-node' or `js2-labeled-stmt-node' w/ loop stmt + node + (end js2-token-end)) + (js2-consume-token) + ;; matchJumpLabelName only matches if there is one + (setq target (js2-match-jump-label-name)) ; a `js2-label-node' or nil + (cond + ((null target) + (if (null js2-loop-set) + (js2-report-error "msg.continue.outside" nil pos (length "continue")) + (setq target (first js2-loop-set)))) ; innermost enclosing loop + (t + (setq label (make-js2-name-node) + end (js2-node-end label)) + (unless (or (js2-loop-node-p target) + (and (js2-labeled-stmt-node-p target) + (js2-loop-node-p (js2-labeled-stmt-node-stmt target)))) + (js2-report-error "msg.continue.nonloop")))) + (setq node (make-js2-continue-node :pos pos + :len (- end pos) + :label label + :target target)) + (js2-node-add-children node label) + node)) + +(defun js2-parse-with () + "Parser for with-statement. Last matched token must be js2-WITH." + (js2-consume-token) + (let ((pos js2-token-beg) + obj + body + node + end + lp + rp) + (if (js2-must-match js2-LP "msg.no.paren.with") + (setq lp js2-token-beg)) + (setq obj (js2-parse-expr)) + (if (js2-must-match js2-RP "msg.no.paren.after.with") + (setq rp js2-token-beg)) + (incf js2-nesting-of-with) + (unwind-protect + (setq body (js2-parse-statement) + end (js2-node-end body)) + (decf js2-nesting-of-with)) + (setq node (make-js2-with-node :pos pos + :len (- end pos) + :object obj + :body body + :lp (js2-relpos lp pos) + :rp (js2-relpos rp pos))) + (js2-node-add-children node obj body) + node)) + +(defun js2-parse-const-var () + "Parser for var- or const-statement. +Last matched token must be js2-CONST or js2-VAR." + (let ((tt (js2-peek-token)) + (pos js2-token-beg) + expr + pn) + (js2-consume-token) + (setq expr (js2-parse-variables tt) + pn (make-js2-expr-stmt-node :pos pos + :len (- (js2-node-end expr) pos) + :expr expr)) + (js2-node-add-children pn expr) + pn)) + +(defun js2-parse-let () + "Parser for let-statement. Last matched token must be js2-LET." + (js2-consume-token) + (let ((let-pos js2-token-beg) + (tt (js2-peek-token)) + expr + pn) + (if (eq tt js2-LP) + (js2-parse-let-stmt t let-pos) ; return value + ;; Else we're looking at a statement like let x = 6, y = 7; + ;; Rhino just returns a variables Node of type Token.LET, + ;; but we'll wrap it in a let-stmt without a block. + (setq expr (js2-parse-variables js2-LET) + pn (make-js2-let-stmt-node :pos let-pos + :len (- (js2-node-end expr) let-pos) + :vars expr)) + (js2-node-add-children pn expr) + pn))) + +(defun js2-parse-ret-yield () + (js2-parse-return-or-yield (js2-peek-token) nil)) + +(defconst js2-parse-return-stmt-enders + (list js2-SEMI js2-RC js2-EOF js2-EOL js2-ERROR js2-RB js2-RP js2-YIELD)) + +(defsubst js2-now-all-set (before after mask) + "Return whether or not the bits in the mask have changed to all set. +BEFORE is bits before change, AFTER is bits after change, and MASK is +the mask for bits. Returns t if all the bits in the mask are set in AFTER +but not BEFORE." + (and (/= (logand before mask) mask) + (= (logand after mask) mask))) + +(defun js2-parse-return-or-yield (tt expr-context) + (let ((pos js2-token-beg) + (end js2-token-end) + (before js2-end-flags) + (inside-function (js2-inside-function)) + e + ret + name) + (unless inside-function + (js2-report-error (if (eq tt js2-RETURN) + "msg.bad.return" + "msg.bad.yield"))) + (js2-consume-token) + ;; This is ugly, but we don't want to require a semicolon. + (unless (memq (js2-peek-token-or-eol) js2-parse-return-stmt-enders) + (setq e (js2-parse-expr) + end (js2-node-end e))) + (cond + ((eq tt js2-RETURN) + (when inside-function + (if (null e) + (setq js2-end-flags (set-flag js2-end-flags js2-end-returns)) + (setq js2-end-flags (set-flag js2-end-flags js2-end-returns-value)))) + (setq ret (make-js2-return-node :pos pos + :len (- end pos) + :retval e)) + (js2-node-add-children ret e) + ;; see if we need a strict mode warning + (if (and inside-function + js2-strict-inconsistent-return-warning + (js2-now-all-set before js2-end-flags + (logior js2-end-returns js2-end-returns-value))) + (js2-add-strict-warning "msg.return.inconsistent" nil pos end))) + (t + (setq js2-end-flags (set-flag js2-end-flags js2-end-yields) + ret (make-js2-yield-node :pos pos + :len (- end pos) + :value e)) + (js2-node-add-children ret e) + (unless expr-context + (setq e ret + ret (make-js2-expr-stmt-node :pos pos + :len (- end pos) + :expr e)) + (js2-node-add-children ret e)) + (js2-set-requires-activation) + (js2-set-is-generator))) + + ;; see if we are mixing yields and value returns. + (when (and inside-function + (js2-now-all-set before js2-end-flags + (logior js2-end-yields js2-end-returns-value))) + (setq name (js2-function-node-name js2-current-script-or-fn)) + (if name + (setq name (js2-name-node-name name))) ; get string from name-node + (if (zerop (length name)) + (js2-report-error "msg.anon.generator.returns" nil pos end) + (js2-report-error "msg.generator.returns" name pos end))) + + ret)) + +(defun js2-parse-debugger () + (js2-consume-token) + (make-js2-debugger-node)) + +(defun js2-parse-default-xml-namespace () + "Parse a `default xml namespace = ' e4x statement." + (let ((pos js2-token-beg) + end expr unary es) + (js2-consume-token) + (js2-must-have-xml) + (js2-set-requires-activation) + (unless (and (js2-match-token js2-NAME) + (string= js2-ts-string "xml")) + (js2-report-error "msg.bad.namespace" nil pos js2-ts-cursor)) + (unless (and (js2-match-token js2-NAME) + (string= js2-ts-string "namespace")) + (js2-report-error "msg.bad.namespace" nil pos js2-ts-cursor)) + (unless (js2-match-token js2-ASSIGN) + (js2-report-error "msg.bad.namespace" nil pos js2-ts-cursor)) + (setq expr (js2-parse-expr) + end (js2-node-end expr) + unary (make-js2-unary-node :type js2-DEFAULTNAMESPACE + :pos pos + :len (- end pos) + :operand expr)) + (js2-node-add-children unary expr) + (make-js2-expr-stmt-node :pos pos + :len (- end pos) + :expr unary))) + +(defun js2-parse-block () + "Parser for a curly-delimited statement block. +Last token matched must be js2-LC." + (let* ((pos js2-token-beg) + (block (make-js2-block-node :pos pos))) + (js2-consume-token) + (setf (js2-block-node-scope block) (make-js2-scope :type js2-BLOCK + :ast-node block)) + (js2-push-scope block) + (unwind-protect + (progn + (js2-parse-statements block) + (js2-must-match js2-RC "msg.no.brace.block") + (setf (js2-node-len block) (- js2-token-end pos))) + (js2-pop-scope)) + block)) + +;; for js2-ERROR too, to have a node for error recovery to work on +(defun js2-parse-semi () + "Parse a statement or handle an error. +Last matched token is js-SEMI or js-ERROR." + (let ((tt (js2-peek-token)) pos len) + (js2-consume-token) + (if (eq tt js2-SEMI) + (make-js2-empty-stmt-node :len 1) + (setq pos js2-token-beg + len (- js2-token-beg pos)) + (js2-report-error "msg.syntax" pos js2-token-end) + (make-js2-error-node :pos pos :len len)))) + +(defun js2-parse-name () + "Parser for identifier or label. Last token matched must be js2-NAME. + +If the name is not followed by a colon, we return the name as a +`js2-expr-stmt-node'. + +If it's followed by a colon, we parse the statement following the +colon and return the whole thing as a `js2-labeled-stmt-node'. +This node is used to accumulate any consecutive labels we find. +We store this node in buffer-local var `js2-statement-label' so +that if the non-label statement following the label(s) is a loop, +the loop can be told its own label for break/continue statements. + +This strategy came from Rhino, presumably via SpiderMonkey." + (let ((pos js2-token-beg) + (end js2-token-end) + (name js2-ts-string) + stmt + pn) + (js2-set-check-for-label) + (setq pn (js2-parse-expr)) + (if (/= (js2-node-type pn) js2-LABEL) + (progn + ;; Parsed non-label expression - wrap with statement node. + (setq pn (make-js2-expr-stmt-node :pos pos + :len (js2-node-len pn) + :type (if (js2-inside-function) + js2-EXPR_VOID + js2-EXPR_RESULT) + :expr pn)) + (js2-node-add-children pn (js2-expr-stmt-node-expr pn))) + ;; Else parsed a label. First add to buffer-local label set. + (js2-consume-token) + (if (assoc name js2-label-set) + (js2-report-error "msg.dup.label")) + (if (null js2-statement-label) + (setq js2-statement-label + (make-js2-labeled-stmt-node :labels (list pn) + :pos (js2-node-pos pn))) + (js2-labeled-stmt-node-add-label js2-statement-label pn)) + (js2-node-add-children js2-statement-label pn) + + ;; Add one reference to the bundle per label in `js2-label-set' + (push (cons name js2-statement-label) js2-label-set) + + ;; Parse the following statement, then remove label from label set. + (unwind-protect + (setf stmt (js2-statement-helper)) + (setq js2-label-set (js2-delete-if (lambda (entry) + (string= (car entry) name)) + js2-label-set))) + ;; At this point we've got at least one label in `js2-statement-label' + ;; and we've parsed stmt, a statement. stmt may be a labeled statement + ;; node, in which case we just pass it up tail-recursively. Otherwise + ;; we save it in the accumulator labled-stmt node and return that. + (if (js2-labeled-stmt-node-p stmt) + (setq pn stmt) ; return tail-recursively + (setf (js2-labeled-stmt-node-stmt js2-statement-label) stmt + ;; set entire length now that stmt is parsed + (js2-node-len js2-statement-label) + (- (js2-node-end stmt) + (js2-node-pos js2-statement-label))) + (js2-node-add-children js2-statement-label stmt) + (setq pn js2-statement-label))) ; return `js2-labeled-stmt-node' + pn)) + +(defun js2-parse-expr-stmt () + (let* ((pos js2-token-beg) + (expr (js2-parse-expr)) + (pn (make-js2-expr-stmt-node :pos pos + :len (js2-node-len expr) + :type (if (js2-inside-function) + js2-EXPR_VOID + js2-EXPR_RESULT) + :expr expr))) + (js2-node-add-children pn expr) + pn)) + +(defun js2-parse-variables (decl-type) + "Parse a comma-separated list of variable declarations. +Could be a 'var', 'const' or 'let' stmt/expr or for-loop initializer. +DECL-TYPE is a token value: either VAR, CONST, or LET depending on context. +For 'var' or 'const', the keyword must be the token last scanned. +Returns the parsed `js2-var-decl-node' expression node. If var/const, the +node length includes the var/const keyword. If it's a let-stmt/expr, then +the node position coincides with the first var-init child." + (let* ((pos (and (/= decl-type js2-LET) js2-token-beg)) + (result (make-js2-var-decl-node :decl-type decl-type + :pos pos)) + destructuring-init + destructuring + kid-pos + s + tt + init + name + node + end + nbeg nend + (continue t)) + ;; Example: + ;; var foo = {a: 1, b: 2}, bar = [3, 4]; + ;; var {b: s2, a: s1} = foo, x = 6, y, [s3, s4] = bar; + (while continue + (setq destructuring nil + s nil + tt (js2-peek-token) + kid-pos js2-token-beg + init nil) + (unless pos + (setf pos kid-pos + (js2-node-pos result) kid-pos)) + (if (or (eq tt js2-LB) (eq tt js2-LC)) + ;; Destructuring assignment, e.g., var [a, b] = ... + (setq destructuring (js2-parse-primary-expr)) + ;; Simple variable name + (js2-must-match js2-NAME "msg.bad.var") + (setq name (make-js2-name-node) + nbeg js2-token-beg + nend js2-token-end) + (js2-define-symbol decl-type js2-ts-string name)) + (setq end js2-token-end) + + (when (js2-match-token js2-ASSIGN) + (setq init (js2-parse-assign-expr) + end (js2-node-end init)) + (when js2-parse-ide-mode + (if (or (js2-object-node-p init) + (js2-function-node-p init)) + (js2-record-imenu-functions init name)))) + + (when nbeg + (js2-set-face nbeg nend + (if (js2-function-node-p init) + 'font-lock-function-name-face + 'font-lock-variable-name-face) + 'record)) + (if destructuring + (progn + (if (null init) + ;; for (var [k, v] in foo) is initialized differently + (unless js2-in-for-init + (js2-report-error "msg.destruct.assign.no.init"))) + (setq node (make-js2-destructuring-init-node :pos kid-pos + :len (- end kid-pos) + :lhs destructuring + :initializer init)) + (js2-node-add-children node destructuring init)) + ;; simple variable, possibly with initializer + (setq node (make-js2-var-init-node :pos kid-pos + :len (- end kid-pos) + :name name + :initializer init)) + (js2-node-add-children node name init)) + + (js2-block-node-push result node) + (unless (js2-match-token js2-COMMA) + (setq continue nil))) + (setf (js2-node-len result) (- end pos)) + result)) + +(defun js2-parse-let-stmt (&optional stmt-p let-pos) + (let ((pos (or let-pos js2-token-beg)) + (scope (make-js2-scope :type js2-LET)) + pn vars stmt expr + pos2 len lp rp) + (if (js2-must-match js2-LP "msg.no.paren.after.let") + (setq lp js2-token-beg)) + (js2-push-scope scope) + (unwind-protect + (progn + (setq vars (js2-parse-variables js2-LET)) + (if (js2-must-match js2-RP "msg.no.paren.let") + (setq rp js2-token-beg)) + (if (and stmt-p (eq (js2-peek-token) js2-LC)) + ;; let statement + (progn + (js2-consume-token) + (setf pos2 js2-token-beg ; pos stmt at LC + stmt (js2-parse-statements) + (js2-node-len stmt) (- js2-ts-cursor pos2) + pn (make-js2-let-stmt-node :pos pos + :vars vars + :body stmt + :lp (js2-relpos lp pos) + :rp (js2-relpos rp pos)) + (js2-let-stmt-node-scope pn) scope + (js2-scope-ast-node scope) pn) + (js2-node-add-children pn vars stmt) + (js2-must-match js2-RC "msg.no.curly.let") + (setf (js2-node-len pn) (- js2-ts-cursor pos))) + ;; let expression + (setf expr (js2-parse-expr) + (js2-scope-type scope) js2-LETEXPR + pn (make-js2-let-expr-node :pos pos + :len (- (js2-node-end expr) pos) + :vars vars + :expr expr + :lp (js2-relpos lp pos) + :rp (js2-relpos rp pos)) + (js2-let-expr-node-scope pn) scope + (js2-scope-ast-node scope) pn) + (js2-node-add-children pn vars expr) + (when stmt-p + ;; let expression in statement context + (setq stmt (make-js2-expr-stmt-node :pos pos + :len (js2-node-len pn) + :type (if (js2-inside-function) + js2-EXPR_VOID + js2-EXPR_RESULT) + :expr pn)) + (js2-node-add-children stmt pn) + (setq pn stmt)))) + (js2-pop-scope)) + pn)) + +(defsubst js2-define-new-symbol (decl-type name node) + (js2-scope-put-symbol js2-current-scope + name + (make-js2-symbol decl-type name node))) + +(defun js2-define-symbol (decl-type name &optional node) + "Define a symbol in the current scope. +If NODE is non-nil, it is the AST node associated with the symbol." + (let* ((defining-scope (js2-get-defining-scope js2-current-scope name)) + (symbol (if defining-scope + (js2-scope-get-symbol defining-scope name))) + (sdt (if symbol (js2-symbol-decl-type symbol)))) + (cond + ((and symbol ; already defined + ;; new version is const + (or (eq decl-type js2-CONST) + ;; old version is const + (eq sdt js2-CONST) + ;; two let-bound vars in this block have same name + (and (eq decl-type js2-LET) + (eq defining-scope js2-current-scope)))) + (js2-report-error + (cond + ((eq sdt js2-CONST) "msg.const.redecl") + ((eq sdt js2-LET) "msg.let.redecl") + ((eq sdt js2-VAR) "msg.var.redecl") + ((eq sdt js2-FUNCTION) "msg.function.redecl") + (t "msg.parm.redecl")) + name)) + + ((eq decl-type js2-LET) + (js2-define-new-symbol decl-type name node)) + + ((or (eq decl-type js2-VAR) + (eq decl-type js2-CONST) + (eq decl-type js2-FUNCTION)) + (if symbol + (if (and (eq sdt js2-VAR) + js2-strict-var-redeclaration-warning) + (js2-add-strict-warning "msg.var.redecl" name) + (if (and (eq sdt js2-LP) + js2-strict-var-hides-function-arg-warning) + (js2-add-strict-warning "msg.var.hides.arg" name))) + (js2-scope-put-symbol js2-current-scope + name + (make-js2-symbol decl-type name node)))) + ((eq decl-type js2-LP) + (if symbol + ;; must be duplicate parameter. Second parameter hides the + ;; first, so go ahead and add the second pararameter + (js2-report-warning "msg.dup.parms" name)) + (js2-define-new-symbol decl-type name node)) + (t + (js2-code-bug))))) + +(defun js2-parse-expr () + (let* ((pn (js2-parse-assign-expr)) + (pos (js2-node-pos pn)) + left + right + op-pos) + (while (js2-match-token js2-COMMA) + (setq op-pos (- js2-token-beg pos)) ; relative + (unless (js2-node-has-side-effects pn) + (js2-add-strict-warning "msg.no.side.effects" nil + pos + (js2-node-end pn))) + (if (eq (js2-peek-token) js2-YIELD) + (js2-report-error "msg.yield.parenthesized")) + (setq right (js2-parse-assign-expr) + left pn + pn (make-js2-infix-node :type js2-COMMA + :pos pos + :len (- js2-ts-cursor pos) + :op-pos op-pos + :left left + :right right)) + (js2-node-add-children pn left right)) + pn)) + +(defun js2-parse-assign-expr () + (let ((tt (js2-peek-token)) + (pos js2-token-beg) + pn + left + right + op-pos) + (if (eq tt js2-YIELD) + (js2-parse-return-or-yield tt t) + ;; not yield - parse assignment expression + (setq pn (js2-parse-cond-expr) + tt (js2-peek-token)) + (when (and (<= js2-first-assign tt) + (<= tt js2-last-assign)) + (js2-consume-token) + (setq op-pos (- js2-token-beg pos) ; relative + left pn + right (js2-parse-assign-expr) + pn (make-js2-assign-node :type tt + :pos pos + :len (- (js2-node-end right) pos) + :op-pos op-pos + :left left + :right right)) + (when js2-parse-ide-mode + (js2-highlight-assign-targets pn left right) + (if (or (js2-function-node-p right) + (js2-object-node-p right)) + (js2-record-imenu-functions right left))) + ;; do this last so ide checks above can use absolute positions + (js2-node-add-children pn left right)) + pn))) + +(defun js2-parse-cond-expr () + (let ((pos js2-token-beg) + (pn (js2-parse-or-expr)) + test-expr + if-true + if-false + q-pos + c-pos) + (when (js2-match-token js2-HOOK) + (setq q-pos (- js2-token-beg pos) + if-true (js2-parse-assign-expr)) + (js2-must-match js2-COLON "msg.no.colon.cond") + (setq c-pos (- js2-token-beg pos) + if-false (js2-parse-assign-expr) + test-expr pn + pn (make-js2-cond-node :pos pos + :len (- (js2-node-end if-false) pos) + :test-expr test-expr + :true-expr if-true + :false-expr if-false + :q-pos q-pos + :c-pos c-pos)) + (js2-node-add-children pn test-expr if-true if-false)) + pn)) + +(defun js2-make-binary (type left parser) + "Helper for constructing a binary-operator AST node. +LEFT is the left-side-expression, already parsed, and the +binary operator should have just been matched. +PARSER is a function to call to parse the right operand, +or a `js2-node' struct if it has already been parsed." + (let* ((pos (js2-node-pos left)) + (op-pos (- js2-token-beg pos)) + (right (if (js2-node-p parser) + parser + (funcall parser))) + (pn (make-js2-infix-node :type type + :pos pos + :len (- (js2-node-end right) pos) + :op-pos op-pos + :left left + :right right))) + (js2-node-add-children pn left right) + pn)) + +(defun js2-parse-or-expr () + (let ((pn (js2-parse-and-expr))) + (when (js2-match-token js2-OR) + (setq pn (js2-make-binary js2-OR + pn + 'js2-parse-or-expr))) + pn)) + +(defun js2-parse-and-expr () + (let ((pn (js2-parse-bit-or-expr))) + (when (js2-match-token js2-AND) + (setq pn (js2-make-binary js2-AND + pn + 'js2-parse-and-expr))) + pn)) + +(defun js2-parse-bit-or-expr () + (let ((pn (js2-parse-bit-xor-expr))) + (while (js2-match-token js2-BITOR) + (setq pn (js2-make-binary js2-BITOR + pn + 'js2-parse-bit-xor-expr))) + pn)) + +(defun js2-parse-bit-xor-expr () + (let ((pn (js2-parse-bit-and-expr))) + (while (js2-match-token js2-BITXOR) + (setq pn (js2-make-binary js2-BITXOR + pn + 'js2-parse-bit-and-expr))) + pn)) + +(defun js2-parse-bit-and-expr () + (let ((pn (js2-parse-eq-expr))) + (while (js2-match-token js2-BITAND) + (setq pn (js2-make-binary js2-BITAND + pn + 'js2-parse-eq-expr))) + pn)) + +(defconst js2-parse-eq-ops + (list js2-EQ js2-NE js2-SHEQ js2-SHNE)) + +(defun js2-parse-eq-expr () + (let ((pn (js2-parse-rel-expr)) + tt) + (while (memq (setq tt (js2-peek-token)) js2-parse-eq-ops) + (js2-consume-token) + (setq pn (js2-make-binary tt + pn + 'js2-parse-rel-expr))) + pn)) + +(defconst js2-parse-rel-ops + (list js2-IN js2-INSTANCEOF js2-LE js2-LT js2-GE js2-GT)) + +(defun js2-parse-rel-expr () + (let ((pn (js2-parse-shift-expr)) + (continue t) + tt) + (while continue + (setq tt (js2-peek-token)) + (cond + ((and js2-in-for-init (eq tt js2-IN)) + (setq continue nil)) + ((memq tt js2-parse-rel-ops) + (js2-consume-token) + (setq pn (js2-make-binary tt pn 'js2-parse-shift-expr))) + (t + (setq continue nil)))) + pn)) + +(defconst js2-parse-shift-ops + (list js2-LSH js2-URSH js2-RSH)) + +(defun js2-parse-shift-expr () + (let ((pn (js2-parse-add-expr)) + tt + (continue t)) + (while continue + (setq tt (js2-peek-token)) + (if (memq tt js2-parse-shift-ops) + (progn + (js2-consume-token) + (setq pn (js2-make-binary tt pn 'js2-parse-add-expr))) + (setq continue nil))) + pn)) + +(defun js2-parse-add-expr () + (let ((pn (js2-parse-mul-expr)) + tt + (continue t)) + (while continue + (setq tt (js2-peek-token)) + (if (or (eq tt js2-ADD) (eq tt js2-SUB)) + (progn + (js2-consume-token) + (setq pn (js2-make-binary tt pn 'js2-parse-mul-expr))) + (setq continue nil))) + pn)) + +(defconst js2-parse-mul-ops + (list js2-MUL js2-DIV js2-MOD)) + +(defun js2-parse-mul-expr () + (let ((pn (js2-parse-unary-expr)) + tt + (continue t)) + (while continue + (setq tt (js2-peek-token)) + (if (memq tt js2-parse-mul-ops) + (progn + (js2-consume-token) + (setq pn (js2-make-binary tt pn 'js2-parse-unary-expr))) + (setq continue nil))) + pn)) + +(defsubst js2-make-unary (type parser &rest args) + "Make a unary node of type TYPE. +PARSER is either a node (for postfix operators) or a function to call +to parse the operand (for prefix operators)." + (let* ((pos js2-token-beg) + (postfix (js2-node-p parser)) + (expr (if postfix + parser + (apply parser args))) + end + pn) + (if postfix ; e.g. i++ + (setq pos (js2-node-pos expr) + end js2-token-end) + (setq end (js2-node-end expr))) + (setq pn (make-js2-unary-node :type type + :pos pos + :len (- end pos) + :operand expr)) + (js2-node-add-children pn expr) + pn)) + +(defconst js2-incrementable-node-types + (list js2-NAME js2-GETPROP js2-GETELEM js2-GET_REF js2-CALL) + "Node types that can be the operand of a ++ or -- operator.") + +(defsubst js2-check-bad-inc-dec (tt beg end unary) + (unless (memq (js2-node-type (js2-unary-node-operand unary)) + js2-incrementable-node-types) + (js2-report-error (if (eq tt js2-INC) + "msg.bad.incr" + "msg.bad.decr") + nil beg (- end beg)))) + +(defun js2-parse-unary-expr () + (let ((tt (js2-peek-token)) + pn expr beg end) + (cond + ((or (eq tt js2-VOID) + (eq tt js2-NOT) + (eq tt js2-BITNOT) + (eq tt js2-TYPEOF)) + (js2-consume-token) + (js2-make-unary tt 'js2-parse-unary-expr)) + + ((eq tt js2-ADD) + (js2-consume-token) + ;; Convert to special POS token in decompiler and parse tree + (js2-make-unary js2-POS 'js2-parse-unary-expr)) + + ((eq tt js2-SUB) + (js2-consume-token) + ;; Convert to special NEG token in decompiler and parse tree + (js2-make-unary js2-NEG 'js2-parse-unary-expr)) + + ((or (eq tt js2-INC) + (eq tt js2-DEC)) + (js2-consume-token) + (prog1 + (setq beg js2-token-beg + end js2-token-end + expr (js2-make-unary tt 'js2-parse-member-expr t)) + (js2-check-bad-inc-dec tt beg end expr))) + + ((eq tt js2-DELPROP) + (js2-consume-token) + (js2-make-unary js2-DELPROP 'js2-parse-unary-expr)) + + ((eq tt js2-ERROR) + (js2-consume-token) + (make-js2-error-node)) ; try to continue + + ((and (eq tt js2-LT) + js2-compiler-xml-available) + ;; XML stream encountered in expression. + (js2-consume-token) + (js2-parse-member-expr-tail t (js2-parse-xml-initializer))) + (t + (setq pn (js2-parse-member-expr t) + ;; Don't look across a newline boundary for a postfix incop. + tt (js2-peek-token-or-eol)) + (when (or (eq tt js2-INC) (eq tt js2-DEC)) + (js2-consume-token) + (setf expr pn + pn (js2-make-unary tt expr)) + (js2-node-set-prop pn 'postfix t) + (js2-check-bad-inc-dec tt js2-token-beg js2-token-end pn)) + pn)))) + +(defun js2-parse-xml-initializer () + "Parse an E4X XML initializer. +I'm parsing it the way Rhino parses it, but without the tree-rewriting. +Then I'll postprocess the result, depending on whether we're in IDE +mode or codegen mode, and generate the appropriate rewritten AST. +IDE mode uses a rich AST that models the XML structure. Codegen mode +just concatenates everything and makes a new XML or XMLList out of it." + (let ((tt (js2-get-first-xml-token)) + (pos js2-token-beg) + pn-xml + pn + n + expr + kids + expr-pos + prepend) + (when (not (or (eq tt js2-XML) (eq tt js2-XMLEND))) + (js2-report-error "msg.syntax")) + (setq pn-xml (make-js2-xml-node)) + (catch 'return + (while t + (cond + ;; js2-XML means we found a {expr} in the XML stream. + ;; The js2-ts-string is the XML up to the left-curly. + ((eq tt js2-XML) + (push (make-js2-string-node :pos js2-token-beg + :len (- js2-ts-cursor js2-token-beg)) + kids) + (js2-must-match js2-LC "msg.syntax") + (setq expr-pos js2-ts-cursor + expr (if (eq (js2-peek-token) js2-RC) + (make-js2-string-node :pos expr-pos + :len 0 + :value "") + (js2-parse-expr))) + (js2-must-match js2-RC "msg.syntax") + (setq pn (make-js2-xml-js-expr-node :pos expr-pos + :len (js2-node-len expr) + :expr expr)) + (js2-node-add-children pn expr) + (push pn kids)) + + ;; a js2-XMLEND token means we hit the final close-tag. + ((eq tt js2-XMLEND) + (push (make-js2-string-node :pos js2-token-beg + :len (- js2-ts-cursor js2-token-beg)) + kids) + (dolist (kid (nreverse kids)) + (js2-block-node-push pn-xml kid)) + (setf (js2-node-len pn-xml) (- js2-ts-cursor + (js2-node-pos pn-xml))) + (throw 'return pn-xml)) + + (t + (js2-report-error "msg.syntax") + (throw 'return pn-xml))) + (setq tt (js2-get-next-xml-token)))))) + +(defun js2-parse-argument-list () + "Parse an argument list and return it as a lisp list of nodes. +Returns the list in reverse order. Consumes the right-paren token." + (let (result) + (unless (js2-match-token js2-RP) + (loop do + (if (eq (js2-peek-token) js2-YIELD) + (js2-report-error "msg.yield.parenthesized")) + (push (js2-parse-assign-expr) result) + while + (js2-match-token js2-COMMA)) + (js2-must-match js2-RP "msg.no.paren.arg") + result))) + +(defun js2-parse-member-expr (&optional allow-call-syntax) + (let ((tt (js2-peek-token)) + pn + pos + target + args + beg + end + init + result) + (if (neq tt js2-NEW) + (setq pn (js2-parse-primary-expr)) + (js2-consume-token) + (setq pos js2-token-beg + target (js2-parse-member-expr) + end (js2-node-end target) + pn (make-js2-new-node :pos pos + :target target + :len (- end pos))) + (js2-node-add-children pn (js2-new-node-target pn)) + (when (js2-match-token js2-LP) + ;; Add the arguments to pn, if any are supplied. + (setf beg pos ; start of "new" keyword + pos js2-token-beg + args (js2-parse-argument-list) + end js2-token-end + (js2-new-node-lp pn) (- pos beg) + (js2-new-node-rp pn) (- end 1 beg)) + + (dolist (arg args) + (push arg (js2-new-node-args pn)) + (js2-node-add-children pn arg))) + + (when (and js2-allow-rhino-new-expr-initializer + (eq (js2-peek-token) js2-LC)) + (js2-consume-token) + (setf init (js2-parse-object-literal) + end (js2-node-end init) + (js2-new-node-initializer pn) init) + (js2-node-add-children pn init)) + + (incf (js2-node-len pn) (- end pos))) + (setq result (js2-parse-member-expr-tail allow-call-syntax pn)) + (if (>= js2-highlight-level 2) + (js2-parse-highlight-member-expr-node result)) + result)) + +(defun js2-parse-member-expr-tail (allow-call-syntax pn) + "Parse a chain of property/array accesses or function calls. +Includes parsing for E4X operators like `..' and `.@'. +If ALLOW-CALL-SYNTAX is nil, stops when we encounter a left-paren. +Returns an expression tree that includes PN, the parent node." + (let (tt args pos expr lb rb + (beg (js2-node-pos pn))) + (catch 'tail-loop + (while t + (setq tt (js2-peek-token)) + (catch 'break-outer + (cond + ((or (eq tt js2-DOT) (eq tt js2-DOTDOT)) + (setq pn (js2-parse-property-access tt pn))) + + ((eq tt js2-DOTQUERY) + (js2-consume-token) + (js2-must-have-xml) + (setq pos js2-token-beg + expr (js2-parse-expr) + pn (make-js2-xml-dot-query-node :left pn + :pos beg + :op-pos pos + :right expr)) + (js2-node-add-children pn + (js2-xml-dot-query-node-left pn) + (js2-xml-dot-query-node-right pn)) + (js2-must-match js2-RP "msg.no.paren") + (setf (js2-node-len pn) (- js2-token-end beg))) + + ((eq tt js2-LB) + (js2-consume-token) + (setq lb js2-token-beg + pos (js2-node-pos pn) + expr (js2-parse-expr)) + (if (js2-must-match js2-RB "msg.no.bracket.index") + (setq rb js2-token-beg)) + (setq pn (make-js2-elem-get-node :target pn + :pos pos + :prop expr + :lb (js2-relpos lb pos) + :rb (js2-relpos rb pos) + :len (- js2-token-end pos))) + (js2-node-add-children pn + (js2-elem-get-node-target pn) + (js2-elem-get-node-prop pn))) + + ((eq tt js2-LP) + (unless allow-call-syntax + (throw 'tail-loop nil)) + (js2-consume-token) + (setq pn (make-js2-call-node :pos beg + :expr pn + :lp (- js2-token-beg beg))) + (js2-node-add-children pn (js2-call-node-expr pn)) + ;; Add the arguments to pn, if any are supplied. + (setf args (js2-parse-argument-list) + (js2-call-node-rp pn) (- js2-token-beg beg)) + (dolist (arg args) + (push arg (js2-call-node-args pn)) + (js2-node-add-children pn arg)) + (setf (js2-node-len pn) (- js2-ts-cursor (js2-node-pos pn)))) + (t + (throw 'tail-loop nil)))))) + pn)) + +(defun js2-parse-property-access (tt pn) + "Parse a property access, XML descendants access, or XML attr access." + (let ((member-type-flags 0) + (dot-pos js2-token-beg) + (dot-len (if (eq tt js2-DOTDOT) 2 1)) + result) + (js2-consume-token) + (when (eq tt js2-DOTDOT) + (js2-must-have-xml) + (setq member-type-flags js2-descendants-flag)) + (if (not js2-compiler-xml-available) + (progn + (js2-must-match-prop-name "msg.no.name.after.dot") + (setq result + (make-js2-prop-get-node :target pn + :pos js2-token-beg + :prop (make-js2-name-node) + :len (- js2-token-end js2-token-beg))) + (js2-node-add-children pn + (js2-prop-get-node-target pn) + (js2-prop-get-node-prop pn)) + result) + (setq tt (js2-next-token)) + (cond + ;; needed for generator.throw(); + ((eq tt js2-THROW) + (js2-parse-property-name pn + (make-js2-name-node) ; "throw" + member-type-flags)) + + ;; handles: name, ns::name, ns::*, ns::[expr] + ((js2-valid-prop-name-token tt) + (js2-parse-property-name pn + (make-js2-name-node) ; name|ns + member-type-flags)) + + ;; handles: *, *::name, *::*, *::[expr] + ((eq tt js2-MUL) + (js2-parse-property-name pn + (make-js2-name-node :name "*") + member-type-flags)) + ;; handles: '@attr', '@ns::attr', '@ns::*', '@ns::*', + ;; '@::attr', '@::*', '@*', '@*::attr', '@*::*' + ((eq tt js2-XMLATTR) + (js2-parse-attribute-access pn member-type-flags)) + (t + (js2-report-error "msg.no.name.after.dot" nil dot-pos dot-len) + (make-js2-error-node :pos dot-pos + :len dot-len)))))) + +(defun js2-parse-attribute-access (pn member-type-flags) + "Parse an E4X XML attribute expression. +PN (parent node) is the XML target to the left of the @ operator." + (let ((tt (js2-next-token)) + expr pos beg len) + (setq member-type-flags (set-flag member-type-flags js2-attribute-flag)) + (cond + ((js2-valid-prop-name-token tt) + ;; handles: @name, @ns::name, @ns::*, @ns::[expr] + (setq pn (js2-parse-property-name pn + (make-js2-name-node) + member-type-flags))) + ;; handles: @*, @*::name, @*::*, @*::[expr] + ((eq tt js2-MUL) + (setq pn (js2-parse-property-name pn + (make-js2-name-node :name "*") + member-type-flags))) + ;; handles @[expr] + ((eq tt js2-LB) + (setq pos (1- js2-ts-cursor) + pn (make-js2-xml-ref-node :pos pos + :ref-expr (js2-parse-expr) + :len (- js2-ts-cursor pos) + :flags member-type-flags)) + (js2-node-add-children pn (js2-xml-ref-node-ref-expr pn)) + (js2-must-match js2-RB "msg.no.bracket.index")) + (t + (if pn + (setq len (js2-node-len pn) + beg (- js2-ts-cursor len)) + (save-excursion + (goto-char js2-ts-cursor) + (setq beg (point-at-bol) + len (- (point-at-eol) beg)))) + (js2-report-error "msg.no.name.after.xmlAttr" nil beg len) + (setq pos (1- js2-ts-cursor) + pn (make-js2-xml-ref-node :pos pos + :target pn + :len (if pn (js2-node-len pn)) + :flags member-type-flags)) + (js2-node-add-children pn (js2-xml-ref-node-target pn)))) + pn)) + +(defsubst js2-create-property-get (target namespace name flags) + "Create either a simple property-get or an XML element-get. +We potentially need to examine quite a few tokens before we can be +sure which one to create, so we pass the state along to this helper +function. NAMESPACE is nil or a string node." + (let (pn pos) + (if (and (null namespace) (zerop flags)) + (if (null target) + name + (prog1 + (setq pos (js2-node-pos target) + pn + (make-js2-prop-get-node :pos pos + :len (- (js2-node-end name) pos) + :target target + :prop name)) + (js2-node-add-children pn target name))) + (setq flags (set-flag flags js2-property-flag)) + (js2-create-member-ref-get target namespace name nil flags)))) + +(defsubst js2-create-element-get (target namespace elem flags) + "Create either a simple element-get or an XML element-get. +ELEM is an expression node. NAMESPACE is nil or a string node." + (let (pn) + (if (and (null namespace) (zerop flags)) + (prog1 + (setq pn (make-js2-elem-get-node :pos (js2-node-pos elem) + :target target + :prop elem)) + (js2-node-add-children pn target elem)) + (js2-create-member-ref-get target namespace nil elem flags)))) + +(defun js2-create-member-ref-get (target namespace name expr flags) + (let ((node (make-js2-xml-ref-node :pos (js2-node-pos (or namespace name)) + :target target + :namespace namespace + :propname name + :ref-expr expr + :flags flags))) + (js2-node-add-children node namespace name expr) + node)) + +(defun js2-parse-property-name (pn name flags) + "Check if :: follows name in which case it becomes qualified name. +PN is the target - the left side of the preceding '.' or '..' operator. +NAME is the identifier we just parsed, a `js2-name-node'. In some +e4x/xml cases, it may not be a valid identifier (e.g. `*')." + (let (namespace + tt + lb + (pos (if pn (js2-node-pos pn)))) + (catch 'return + (when (js2-match-token js2-COLONCOLON) + (setq namespace (make-js2-string-node :value name) + tt (js2-next-token)) + (cond + ((js2-valid-prop-name-token tt) ; handles name::name + (setq name (make-js2-string-node))) + ((eq tt js2-MUL) ; handles name::* + (setq name (make-js2-string-node :value "*"))) + ((eq tt js2-LB) ; handles name::[expr] + (setq lb (- js2-token-beg pos) + pn (js2-create-element-get pn + namespace + (js2-parse-expr) + flags)) + (setf (js2-elem-get-node-lb pn) lb) + (if (js2-must-match js2-RB "msg.no.bracket.index") + (setf (js2-elem-get-node-rb pn) (- js2-token-beg pos))) + (throw 'return pn)) + (t + (js2-report-error "msg.no.name.after.coloncolon")))) + (js2-create-property-get pn namespace name flags)))) + +(defun js2-parse-primary-expr () + (let* (pn ; parent node + (tt-flagged (js2-next-flagged-token)) + (tt (logand tt-flagged js2-clear-ti-mask)) + px-pos + name + name-pos + name-end + flags + index + expr) + (cond + ((eq tt js2-FUNCTION) + (js2-parse-function 'FUNCTION_EXPRESSION)) + + ((eq tt js2-LB) + (js2-parse-array-literal)) + + ((eq tt js2-LC) + (js2-parse-object-literal)) + + ((eq tt js2-LET) + (js2-parse-let-stmt)) + + ((eq tt js2-LP) + (setq px-pos js2-token-beg + expr (js2-parse-expr)) + (js2-must-match js2-RP "msg.no.paren") + (setq pn (make-js2-paren-node :pos px-pos + :expr expr + :len (- js2-token-end px-pos))) + (js2-node-add-children pn (js2-paren-node-expr pn)) + pn) + + ((eq tt js2-XMLATTR) + (js2-must-have-xml) + (js2-parse-attribute-access nil 0)) + + ((eq tt js2-NAME) + (setq name js2-ts-string + name-pos js2-token-beg + name-end js2-token-end) + (if (and (flag-set-p tt-flagged js2-ti-check-label) + (eq (js2-peek-token) js2-COLON)) + (prog1 + ;; Do not consume colon, it is used as unwind indicator + ;; to return to statementHelper. + (make-js2-label-node :pos name-pos + :len (- js2-token-end name-pos) + :label name) + (js2-set-face name-pos + js2-token-end + 'font-lock-variable-name-face 'record)) + ;; otherwise not a label, just a name + (setq name (make-js2-name-node :name name + :pos name-pos + :len (- name-end name-pos))) + (if js2-compiler-xml-available + (js2-parse-property-name nil name 0) + name))) + + ((eq tt js2-NUMBER) + (make-js2-number-node)) + + ((eq tt js2-STRING) + (prog1 + (make-js2-string-node) + (js2-set-face js2-token-beg js2-token-end 'font-lock-string-face 'record))) + + ((or (eq tt js2-DIV) (eq tt js2-ASSIGN_DIV)) + ;; Got / or /= which should be treated as regexp in fact + (setq px-pos js2-token-beg) + (js2-read-regexp tt) + (setq flags js2-ts-regexp-flags + js2-ts-regexp-flags nil) + (prog1 + (make-js2-regexp-node :pos px-pos + :len (- js2-ts-cursor px-pos) + :value js2-ts-string + :flags flags) + (js2-set-face px-pos js2-ts-cursor 'font-lock-string-face 'record))) + ((or (eq tt js2-NULL) + (eq tt js2-THIS) + (eq tt js2-FALSE) + (eq tt js2-TRUE)) + (make-js2-literal-node :type tt)) + + ((eq tt js2-RESERVED) + (js2-report-error "msg.reserved.id") + (make-js2-name-node)) + + ((eq tt js2-ERROR) + ;; the scanner or one of its subroutines reported the error. + (make-js2-error-node)) + + ((eq tt js2-EOF) + (js2-report-error "msg.unexpected.eof") + (make-js2-error-node)) + + (t + (js2-report-error "msg.syntax") + (make-js2-error-node))))) + +(defsubst js2-parse-warn-trailing-comma (msg pos elems comma-pos) + (js2-add-strict-warning + msg nil + ;; back up from comma to beginning of line or array/objlit + (max (if elems + (js2-node-pos (car elems)) + pos) + (save-excursion + (goto-char comma-pos) + (back-to-indentation) + (point))) + comma-pos)) + +;; Pulled out of giant switch case in Parser.primaryExpr() +(defun js2-parse-array-literal () + (let ((pos js2-token-beg) + (after-lb-or-comma t) + after-comma + tt + elems + result + (continue t)) + (while continue + (setq tt (js2-peek-token)) + (cond + ((eq tt js2-COMMA) + (js2-consume-token) + (setq after-comma js2-ts-cursor) + (if (not after-lb-or-comma) + (setq after-lb-or-comma t) + (push nil elems))) + + ((or (eq tt js2-RB) + (eq tt js2-EOF)) + (if (eq tt js2-EOF) + (js2-report-error "msg.no.bracket.arg" nil pos) + (js2-consume-token)) + (setq continue nil + result (make-js2-array-node :pos pos + :len (- js2-ts-cursor pos))) + (when after-comma + (js2-parse-warn-trailing-comma "msg.array.trailing.comma" + pos elems after-comma)) + (dolist (elem elems) + (js2-node-add-children result elem) + (push elem (js2-array-node-elems result)))) + + ((and (>= js2-language-version 170) + (eq tt js2-FOR) ; check for array comprehension + (not after-lb-or-comma) ; "for" can't follow a comma + elems ; must have at least 1 element + (not (cdr elems))) ; but no 2nd element + (setf continue nil + result (js2-parse-array-comprehension (car elems) pos))) + (t + (unless after-lb-or-comma + (js2-report-error "msg.no.bracket.arg")) + (push (js2-parse-assign-expr) elems) + (setq after-lb-or-comma nil + after-comma nil)))) + result)) + +(defun js2-parse-array-comprehension (expr pos) + "Parse a JavaScript 1.7 Array Comprehension. +EXPR is the first expression after the opening left-bracket. +POS is the beginning of the LB token preceding EXPR. +We should have just parsed the 'for' keyword before calling this function." + (let (loops + filter + if-pos + result + (continue t)) + (while continue + (if (eq (js2-peek-token) js2-FOR) + (push (js2-parse-array-comp-loop) loops) + (setq continue nil))) + (when (eq (js2-peek-token) js2-IF) + (js2-consume-token) + (setq if-pos (- js2-token-beg pos) ; relative + filter (js2-parse-condition))) + (js2-must-match js2-RB "msg.no.bracket.arg" pos) + (setq result (make-js2-array-comp-node :pos pos + :len (- js2-ts-cursor pos) + :result expr + :filter (car filter) + :lp (js2-relpos (second filter) pos) + :rp (js2-relpos (third filter) pos) + :if-pos if-pos)) + (js2-node-add-children result expr (car filter)) + ;; reverse and append loops + (dolist (lp loops) + (push lp (js2-array-comp-node-loops result)) + (js2-node-add-children result lp)) + result)) + +(defun js2-parse-array-comp-loop () + "Parse a 'for [each] (foo in bar)' expression in an Array comprehension. +Last token peeked should be the initial FOR." + (let ((pos js2-token-beg) + (pn (make-js2-array-comp-loop-node)) + tt + iter + obj + foreach-p + in-pos + each-pos + lp + rp) + (unless (eq (js2-next-token) js2-FOR) ; consumes token + (js2-code-bug)) ; shouldn't be here if next token isn't 'for' + + (js2-enter-loop pn) + (unwind-protect + (progn + (when (js2-match-token js2-NAME) + (if (string= js2-ts-string "each") + (progn + (setq foreach-p t + each-pos (- js2-token-beg pos)) ; relative + (js2-set-face js2-token-beg js2-token-end + 'font-lock-keyword-face 'record)) + (js2-report-error "msg.no.paren.for"))) + (if (js2-must-match js2-LP "msg.no.paren.for") + (setq lp (- js2-token-beg pos))) + (setq tt (js2-peek-token)) + (cond + ((or (eq tt js2-LB) (eq tt js2-LC)) + ;; handle destructuring assignment + (setq iter (js2-parse-primary-expr))) + ((eq tt js2-NAME) + (js2-consume-token) + (setq iter (make-js2-name-node))) + (t + (js2-report-error "msg.bad.var"))) + + ;; Define as a let since we want the scope of the variable to + ;; be restricted to the array comprehension + (if (js2-name-node-p iter) + (js2-define-symbol js2-LET (js2-name-node-name iter) pn)) + + (if (js2-must-match js2-IN "msg.in.after.for.name") + (setq in-pos (- js2-token-beg pos))) + (setq obj (js2-parse-expr)) + (if (js2-must-match js2-RP "msg.no.paren.for.ctrl") + (setq rp (- js2-token-beg pos))) + (setf (js2-node-pos pn) pos + (js2-node-len pn) (- js2-ts-cursor pos) + (js2-array-comp-loop-node-iterator pn) iter + (js2-array-comp-loop-node-object pn) obj + (js2-array-comp-loop-node-in-pos pn) in-pos + (js2-array-comp-loop-node-each-pos pn) each-pos + (js2-array-comp-loop-node-foreach-p pn) foreach-p + (js2-array-comp-loop-node-lp pn) lp + (js2-array-comp-loop-node-rp pn) rp) + (js2-node-add-children pn iter obj)) + (js2-exit-loop)) + pn)) + +(defun js2-parse-object-literal () + (let ((pos js2-token-beg) + tt + elems + result + prop + node + ppos + pend + expr + get-or-set + after-comma + (continue t)) + (while continue + (setq tt (js2-peek-token)) + (cond + ((or (js2-valid-prop-name-token tt) + (eq tt js2-STRING)) + (js2-consume-token) + (setq after-comma nil + ppos js2-token-beg + pend js2-token-end + prop js2-ts-string + node (make-js2-name-node)) + (if (not (and (eq tt js2-NAME) + (eq (js2-peek-token) js2-NAME) + (or (string= prop "get") + (string= prop "set")))) + (progn + (setq expr (js2-parse-plain-property node)) + (js2-set-face ppos pend + (if (js2-function-node-p + (js2-object-prop-node-right expr)) + 'font-lock-function-name-face + 'font-lock-variable-name-face) + 'record) + (push expr elems)) + (js2-consume-token) + (js2-set-face ppos pend 'font-lock-keyword-face 'record) + (js2-set-face js2-token-beg js2-token-end + 'font-lock-function-name-face 'record) + (setq get-or-set (make-js2-string-node :pos ppos + :len (- pend ppos) + :value prop) + result (js2-parse-getter-setter-prop (make-js2-name-node) + get-or-set)) + (when (and (null result) + (not js2-recover-from-parse-errors)) + (setq continue nil)) + (push result elems))) + + ((eq tt js2-NUMBER) + (js2-consume-token) + (setq after-comma nil) + (push (js2-parse-plain-property (make-js2-number-node)) elems)) + + ;; trailing comma + ((eq tt js2-RC) + (setq continue nil) + (if after-comma + (js2-parse-warn-trailing-comma "msg.extra.trailing.comma" + pos elems after-comma))) + (t + (js2-report-error "msg.bad.prop") + (unless js2-recover-from-parse-errors + (setq continue nil)))) ; end switch + + (if (js2-match-token js2-COMMA) + (setq after-comma js2-token-end) + (setq continue nil))) ; end loop + + (js2-must-match js2-RC "msg.no.brace.prop") + (setq result (make-js2-object-node :pos pos + :len (- js2-ts-cursor pos))) + (dolist (e elems) + (js2-node-add-children result e) + (push e (js2-object-node-elems result))) + result)) + +(defun js2-parse-plain-property (prop) + "Parse a non-getter/setter property in an object literal. +PROP is the node representing the property: a number, name or string." + (let ((pos (js2-node-pos prop)) + colon + result + expr) + (js2-must-match js2-COLON "msg.no.colon.prop") + (setq colon (- js2-token-beg pos) + expr (js2-parse-assign-expr) + result (make-js2-object-prop-node + :pos pos + ;; don't include last consumed token in length + :len (- (+ (js2-node-pos expr) + (js2-node-len expr)) + pos) + :left prop + :right expr + :op-pos colon)) + (js2-node-add-children result prop expr) + result)) + +(defun js2-parse-getter-setter-prop (prop get-or-set) + "Parse getter or setter property in object literal. +PROP is the `js2-name-node' representing the property name. +GET-OR-SET is a `js2-string-node' representing the get/set keyword." + (let ((f (js2-parse-function 'FUNCTION_EXPRESSION)) + result + (pos (js2-node-pos get-or-set)) + (type (if (string= "get" (js2-string-node-value get-or-set)) + js2-GET + js2-SET))) + (if (/= (js2-node-type f) js2-FUNCTION) + (js2-report-error "msg.bad.prop") + (if (plusp (length (js2-function-name f))) + (js2-report-error "msg.bad.prop"))) + (js2-node-set-prop f 'GETTER_SETTER type) + (setq result (make-js2-getter-setter-node :type type + :pos pos + :len (- js2-ts-cursor pos) + :left prop + :right f + :kwd get-or-set)) + (js2-node-add-children result prop f get-or-set) + result)) + +(provide 'js2-parse) + +;;; js2-parse.el ends here +;;; js2-indent.el --- indentation for js2-mode +;; +;; Copyright (C) 2008 Steve Yegge +;; Author: Steve Yegge (steve.yegge@gmail.com) +;; Maintainer: Steve Yegge (steve.yegge@gmail.com) + +;; Commentary: +;; +;; This indenter is based on Karl Landström's "javascript.el" indenter. +;; Karl cleverly deduces that the desired indentation level is often a +;; function of paren/bracket/brace nesting depth, which can be determined +;; quickly via the built-in `parse-partial-sexp' function. His indenter +;; then does some equally clever checks to see if we're in the context of a +;; substatement of a possibly braceless statement keyword such as if, while, +;; or finally. This approach yields pretty good results. +;; +;; The indenter is often "wrong", however, and needs to be overridden. +;; The right long-term solution is probably to emulate (or modify) +;; cc-engine, but it's thousands upon thousands of lines of code. Even +;; if you were to assume the accurate parse tree from `js2-parse' is +;; present, indentation is still thousands of lines of code (I've been +;; down that path) to handle every possible syntactic edge case, and in +;; any case, relying on the parse tree is undesirable because parsing is +;; slow. So you might as well go the cc-engine approach, but it's a +;; huge pile of work that I'm just not up for any time soon. +;; +;; In the meantime, the compromise solution is that we offer a +;; "bounce indenter", configured with `js2-bounce-indent-flag', which +;; cycles the current line indent among various likely guess points. +;; This approach is far from perfect, but should at least make it +;; slightly easier to move the line towards its desired indentation +;; when manually overriding Karl's heuristic nesting guesser. +;; +;; I've made miscellaneous tweaks to Karl's code to handle some Ecma +;; extensions such as `let' and Array comprehensions, and will likely +;; make further tweaks to it, but major kudos to Karl for coming up with +;; the initial approach, which packs a lot of punch for so little code. + +;;; Code: + +(defconst js-possibly-braceless-keyword-re + (regexp-opt + '("catch" "do" "else" "finally" "for" "if" "try" "while" "with" "let") + 'words) + "Regular expression matching keywords that are optionally +followed by an opening brace.") + +(defconst js-indent-operator-re + (concat "[-+*/%<>=&^|?:.]\\([^-+*/]\\|$\\)\\|" + (regexp-opt '("in" "instanceof") 'words)) + "Regular expression matching operators that affect indentation +of continued expressions.") + +;; This function has horrible results if you're typing an array +;; such as [[1, 2], [3, 4], [5, 6]]. Bounce indenting -really- sucks +;; in conjunction with electric-indent, so just disabling it. +(defsubst js2-code-at-bol-p () + "Return t if the first character on line is non-whitespace." + nil) +;; (not (memq (char-after (point-at-bol)) +;; '(? ?\t))))) + +(defun js2-insert-and-indent (key) + "Run command bound to key and indent current line. Runs the command +bound to KEY in the global keymap and indents the current line." + (interactive (list (this-command-keys))) + (let ((cmd (lookup-key (current-global-map) key))) + (if (commandp cmd) + (call-interactively cmd))) + ;; don't do the electric keys inside comments or strings, + ;; and don't do bounce-indent with them. + (let ((parse-state (parse-partial-sexp (point-min) (point))) + (js2-bounce-indent-flag (js2-code-at-bol-p))) + (unless (or (nth 3 parse-state) + (nth 4 parse-state)) + (indent-according-to-mode)))) + +(defun js-re-search-forward-inner (regexp &optional bound count) + "Auxiliary function for `js-re-search-forward'." + (let ((parse) + (saved-point (point-min))) + (while (> count 0) + (re-search-forward regexp bound) + (setq parse (parse-partial-sexp saved-point (point))) + (cond ((nth 3 parse) + (re-search-forward + (concat "\\([^\\]\\|^\\)" (string (nth 3 parse))) + (save-excursion (end-of-line) (point)) t)) + ((nth 7 parse) + (forward-line)) + ((or (nth 4 parse) + (and (eq (char-before) ?\/) (eq (char-after) ?\*))) + (re-search-forward "\\*/")) + (t + (setq count (1- count)))) + (setq saved-point (point)))) + (point)) + +(defun js-re-search-forward (regexp &optional bound noerror count) + "Search forward but ignore strings and comments. Invokes +`re-search-forward' but treats the buffer as if strings and +comments have been removed." + (let ((saved-point (point)) + (search-expr + (cond ((null count) + '(js-re-search-forward-inner regexp bound 1)) + ((< count 0) + '(js-re-search-backward-inner regexp bound (- count))) + ((> count 0) + '(js-re-search-forward-inner regexp bound count))))) + (condition-case err + (eval search-expr) + (search-failed + (goto-char saved-point) + (unless noerror + (error (error-message-string err))))))) + +(defun js-re-search-backward-inner (regexp &optional bound count) + "Auxiliary function for `js-re-search-backward'." + (let ((parse) + (saved-point (point-min))) + (while (> count 0) + (re-search-backward regexp bound) + (setq parse (parse-partial-sexp saved-point (point))) + (cond ((nth 3 parse) + (re-search-backward + (concat "\\([^\\]\\|^\\)" (string (nth 3 parse))) + (save-excursion (beginning-of-line) (point)) t)) + ((nth 7 parse) + (goto-char (nth 8 parse))) + ((or (nth 4 parse) + (and (eq (char-before) ?/) (eq (char-after) ?*))) + (re-search-backward "/\\*")) + (t + (setq count (1- count)))))) + (point)) + +(defun js-re-search-backward (regexp &optional bound noerror count) + "Search backward but ignore strings and comments. Invokes +`re-search-backward' but treats the buffer as if strings and +comments have been removed." + (let ((saved-point (point)) + (search-expr + (cond ((null count) + '(js-re-search-backward-inner regexp bound 1)) + ((< count 0) + '(js-re-search-forward-inner regexp bound (- count))) + ((> count 0) + '(js-re-search-backward-inner regexp bound count))))) + (condition-case err + (eval search-expr) + (search-failed + (goto-char saved-point) + (unless noerror + (error (error-message-string err))))))) + +(defun js-looking-at-operator-p () + "Return non-nil if text after point is an operator (that is not +a comma)." + (save-match-data + (and (looking-at js-indent-operator-re) + (or (not (looking-at ":")) + (save-excursion + (and (js-re-search-backward "[?:{]\\|\\" nil t) + (looking-at "?"))))))) + +(defun js-continued-expression-p () + "Returns non-nil if the current line continues an expression." + (save-excursion + (back-to-indentation) + (or (js-looking-at-operator-p) + (and (js-re-search-backward "\n" nil t) + (progn + (skip-chars-backward " \t") + (backward-char) + (and (js-looking-at-operator-p) + (and (progn (backward-char) + (not (looking-at "\\*\\|++\\|--\\|/[/*]")))))))))) + +(defun js-end-of-do-while-loop-p () + "Returns non-nil if word after point is `while' of a do-while +statement, else returns nil. A braceless do-while statement +spanning several lines requires that the start of the loop is +indented to the same column as the current line." + (interactive) + (save-excursion + (save-match-data + (when (looking-at "\\s-*\\") + (if (save-excursion + (skip-chars-backward "[ \t\n]*}") + (looking-at "[ \t\n]*}")) + (save-excursion + (backward-list) (backward-word 1) (looking-at "\\")) + (js-re-search-backward "\\" (point-at-bol) t) + (or (looking-at "\\") + (let ((saved-indent (current-indentation))) + (while (and (js-re-search-backward "^[ \t]*\\<" nil t) + (/= (current-indentation) saved-indent))) + (and (looking-at "[ \t]*\\") + (not (js-re-search-forward + "\\" (point-at-eol) t)) + (= (current-indentation) saved-indent))))))))) + +(defun js-ctrl-statement-indentation () + "Returns the proper indentation of the current line if it +starts the body of a control statement without braces, else +returns nil." + (let (forward-sexp-function) ; temporarily unbind it + (save-excursion + (back-to-indentation) + (when (save-excursion + (and (not (js2-same-line (point-min))) + (not (looking-at "{")) + (js-re-search-backward "[[:graph:]]" nil t) + (not (looking-at "[{([]")) + (progn + (forward-char) + (backward-sexp) + (when (looking-at "(") (backward-word 1)) + (and (save-excursion + (skip-chars-backward " \t}" (point-at-bol)) + (bolp)) + (looking-at js-possibly-braceless-keyword-re) + (not (js-end-of-do-while-loop-p)))))) + (save-excursion + (goto-char (match-beginning 0)) + (+ (current-indentation) js2-basic-offset)))))) + +(defun js2-indent-in-array-comp (parse-status) + "Return non-nil if we think we're in an array comprehension. +In particular, return the buffer position of the first `for' kwd." + (let ((end (point))) + (when (nth 1 parse-status) + (save-excursion + (goto-char (nth 1 parse-status)) + (when (looking-at "\\[") + (forward-char 1) + (js2-forward-sws) + (if (looking-at "[[{]") + (let (forward-sexp-function) ; use lisp version + (forward-sexp) ; skip destructuring form + (js2-forward-sws) + (if (and (/= (char-after) ?,) ; regular array + (looking-at "for")) + (match-beginning 0))) + ;; to skip arbitrary expressions we need the parser, + ;; so we'll just guess at it. + (if (re-search-forward "[^,]* \\(for\\) " end t) + (match-beginning 1)))))))) + +(defun js2-array-comp-indentation (parse-status for-kwd) + (if (js2-same-line for-kwd) + ;; first continuation line + (save-excursion + (goto-char (nth 1 parse-status)) + (forward-char 1) + (skip-chars-forward " \t") + (current-column)) + (save-excursion + (goto-char for-kwd) + (current-column)))) + +(defun js-proper-indentation (parse-status) + "Return the proper indentation for the current line." + (save-excursion + (back-to-indentation) + (let ((ctrl-stmt-indent (js-ctrl-statement-indentation)) + (same-indent-p (looking-at "[]})]\\|\\\\|\\")) + (continued-expr-p (js-continued-expression-p)) + (bracket (nth 1 parse-status)) + beg) + (cond + ;; indent array comprehension continuation lines specially + ((and bracket + (not (js2-same-line bracket)) + (setq beg (js2-indent-in-array-comp parse-status)) + (>= (point) (save-excursion + (goto-char beg) + (point-at-bol)))) ; at or after first loop? + (js2-array-comp-indentation parse-status beg)) + + (ctrl-stmt-indent) + + (bracket + (goto-char bracket) + (cond + ((looking-at "[({[][ \t]*\\(/[/*]\\|$\\)") + (let ((p (parse-partial-sexp (point-at-bol) (point)))) + (when (save-excursion (skip-chars-backward " \t)") + (looking-at ")")) + (backward-list)) + (if (nth 1 p) + (progn (goto-char (1+ (nth 1 p))) + (skip-chars-forward " \t")) + (back-to-indentation)) + (cond (same-indent-p + (current-column)) + (continued-expr-p + (+ (current-column) (* 2 js2-basic-offset))) + (t + (+ (current-column) js2-basic-offset))))) + (t + (unless same-indent-p + (forward-char) + (skip-chars-forward " \t")) + (current-column)))) + + (continued-expr-p js2-basic-offset) + (t 0))))) + +(defun js2-lineup-comment (parse-status) + "Indent a multi-line block comment continuation line." + (let* ((beg (nth 8 parse-status)) + (first-line (js2-same-line beg)) + (offset (save-excursion + (goto-char beg) + (if (looking-at "/\\*") + (+ 1 (current-column)) + 0)))) + (unless first-line + (indent-line-to offset)))) + +(defun js2-backward-sws () + "Move backward through whitespace and comments." + (interactive) + (while (forward-comment -1))) + +(defun js2-forward-sws () + "Move forward through whitespace and comments." + (interactive) + (while (forward-comment 1))) + +(defsubst js2-current-indent (&optional pos) + "Return column of indentation on current line. +If POS is non-nil, go to that point and return indentation for that line." + (save-excursion + (if pos + (goto-char pos)) + (back-to-indentation) + (current-column))) + +(defsubst js2-arglist-close () + "Return non-nil if we're on a line beginning with a close-paren/brace." + (save-match-data + (save-excursion + (goto-char (point-at-bol)) + (js2-forward-sws) + (looking-at "[])}]")))) + +(defsubst js2-indent-looks-like-label-p () + (goto-char (point-at-bol)) + (js2-forward-sws) + (looking-at (concat js2-mode-identifier-re ":"))) + +(defun js2-indent-in-objlit-p (parse-status) + "Return non-nil if this looks like an object-literal entry." + (let ((start (nth 1 parse-status))) + (and + start + (save-excursion + (and (zerop (forward-line -1)) + (not (< (point) start)) ; crossed a {} boundary + (js2-indent-looks-like-label-p))) + (save-excursion + (js2-indent-looks-like-label-p))))) + +;; if prev line looks like foobar({ then we're passing an object +;; literal to a function call, and people pretty much always want to +;; de-dent back to the previous line, so move the 'basic-offset' +;; position to the front. +(defsubst js2-indent-objlit-arg-p (parse-status) + (save-excursion + (back-to-indentation) + (js2-backward-sws) + (and (eq (1- (point)) (nth 1 parse-status)) + (eq (char-before) ?{) + (progn + (forward-char -1) + (skip-chars-backward " \t") + (eq (char-before) ?\())))) + +(defsubst js2-indent-case-block-p () + (save-excursion + (back-to-indentation) + (js2-backward-sws) + (goto-char (point-at-bol)) + (skip-chars-forward " \t") + (save-match-data + (looking-at "case\\s-.+:")))) + +(defsubst js2-syntax-bol () + "Return the point at the first non-whitespace char on the line. +Returns `point-at-bol' if the line is empty." + (save-excursion + (beginning-of-line) + (skip-chars-forward " \t") + (point))) + +(defun js2-bounce-indent (normal-col parse-status) + "Cycle among alternate computed indentation positions. +PARSE-STATUS is the result of `parse-partial-sexp' from the beginning +of the buffer to the current point. NORMAL-COL is the indentation +column computed by the heuristic guesser based on current paren, +bracket, brace and statement nesting." + (let ((cur-indent (js2-current-indent)) + (old-buffer-undo-list buffer-undo-list) + ;; Emacs 21 only has `count-lines', not `line-number-at-pos' + (current-line (save-excursion + (forward-line 0) ; move to bol + (1+ (count-lines (point-min) (point))))) + positions + pos + anchor + arglist-cont + same-indent + prev-line-col + basic-offset + computed-pos) + ;; temporarily don't record undo info, if user requested this + (if js2-mode-indent-inhibit-undo + (setq buffer-undo-list t)) + (unwind-protect + (progn + ;; first likely point: indent from beginning of previous code line + (push (setq basic-offset + (+ (save-excursion + (back-to-indentation) + (js2-backward-sws) + (back-to-indentation) + (setq prev-line-col (current-column))) + js2-basic-offset)) + positions) + + ;; second likely point: indent from assign-expr RHS. This + ;; is just a crude guess based on finding " = " on the previous + ;; line containing actual code. + (setq pos (save-excursion + (save-match-data + (forward-line -1) + (goto-char (point-at-bol)) + (when (re-search-forward "\\s-+\\(=\\)\\s-+" + (point-at-eol) t) + (goto-char (match-end 1)) + (skip-chars-forward " \t\r\n") + (current-column))))) + (when pos + (incf pos js2-basic-offset) + (unless (member pos positions) + (push pos positions))) + + ;; third likely point: same indent as previous line of code. + ;; Make it the first likely point if we're not on an + ;; arglist-close line and previous line ends in a comma, or + ;; both this line and prev line look like object-literal + ;; elements. + (setq pos (save-excursion + (goto-char (point-at-bol)) + (js2-backward-sws) + (back-to-indentation) + (prog1 + (current-column) + ;; while we're here, look for trailing comma + (if (save-excursion + (goto-char (point-at-eol)) + (js2-backward-sws) + (eq (char-before) ?,)) + (setq arglist-cont (1- (point))))))) + (when pos + (if (and (or arglist-cont + (js2-indent-in-objlit-p parse-status)) + (not (js2-arglist-close))) + (setq same-indent pos)) + (unless (member pos positions) + (push pos positions))) + + ;; fourth likely position: first preceding code with less indentation + ;; than the immediately preceding code line. + (setq pos (save-excursion + (js2-backward-sws) + (back-to-indentation) + (setq anchor (current-column)) + (while (and (zerop (forward-line -1)) + (>= (progn + (back-to-indentation) + (current-column)) + anchor))) + (setq pos (current-column)))) + (unless (member pos positions) + (push pos positions)) + + ;; put nesting-heuristic position first in list, sort rest + (setq positions (nreverse (sort positions '<))) + (setq positions (cons normal-col (delete normal-col positions))) + + ;; comma-list continuation lines: prev line indent takes precedence + (if same-indent + (setq positions + (cons same-indent + (sort (delete same-indent positions) '<)))) + + ;; common special cases where we want to indent in from previous line + (if (or (js2-indent-case-block-p) + (js2-indent-objlit-arg-p parse-status)) + (setq positions + (cons basic-offset + (delete basic-offset positions)))) + + ;; record whether we're already sitting on one of the alternatives + (setq pos (member cur-indent positions)) + (cond + ;; case 0: we're one one of the alternatives and this is the + ;; first time they've pressed TAB on this line (best-guess). + ((and js2-mode-indent-ignore-first-tab + pos + ;; first time pressing TAB on this line? + (not (eq js2-mode-last-indented-line current-line))) + ;; do nothing + (setq computed-pos nil)) + ;; case 1: only one computed position => use it + ((null (cdr positions)) + (setq computed-pos 0)) + ;; case 2: not on any of the computed spots => use main spot + ((not pos) + (setq computed-pos 0)) + ;; case 3: on last position: cycle to first position + ((null (cdr pos)) + (setq computed-pos 0)) + ;; case 4: on intermediate position: cycle to next position + (t + (setq computed-pos (js2-position (second pos) positions)))) + + ;; see if any hooks want to indent; otherwise we do it + (loop with result = nil + for hook in js2-indent-hook + while (null result) + do + (setq result (funcall hook positions computed-pos)) + finally do + (unless (or result (null computed-pos)) + (indent-line-to (nth computed-pos positions))))) + + ;; finally + (if js2-mode-indent-inhibit-undo + (setq buffer-undo-list old-buffer-undo-list)) + ;; see commentary for `js2-mode-last-indented-line' + (setq js2-mode-last-indented-line current-line)))) + +(defsubst js2-1-line-comment-continuation-p () + "Return t if we're in a 1-line comment continuation. +If so, we don't ever want to use bounce-indent." + (save-excursion + (save-match-data + (and (progn + (forward-line 0) + (looking-at "\\s-*//")) + (progn + (forward-line -1) + (forward-line 0) + (when (looking-at "\\s-*$") + (js2-backward-sws) + (forward-line 0)) + (looking-at "\\s-*//")))))) + +(defun js2-indent-line () + "Indent the current line as JavaScript source text." + (interactive) + (let (parse-status + current-indent + offset + indent-col + moved + ;; don't whine about errors/warnings when we're indenting. + ;; This has to be set before calling parse-partial-sexp below. + (inhibit-point-motion-hooks t)) + (setq parse-status (save-excursion + (parse-partial-sexp (point-min) + (point-at-bol))) + offset (- (point) (save-excursion + (back-to-indentation) + (setq current-indent (current-column)) + (point)))) + (js2-with-underscore-as-word-syntax + (if (nth 4 parse-status) + (js2-lineup-comment parse-status) + (setq indent-col (js-proper-indentation parse-status)) + ;; see comments below about js2-mode-last-indented-line + (when + (cond + ;; bounce-indenting is disabled during electric-key indent. + ;; It doesn't work well on first line of buffer. + ((and js2-bounce-indent-flag + (not (js2-same-line (point-min))) + (not (js2-1-line-comment-continuation-p))) + (js2-bounce-indent indent-col parse-status) + (setq moved t)) + ;; just indent to the guesser's likely spot + ((/= current-indent indent-col) + (indent-line-to indent-col) + (setq moved t))) + (when (and moved (plusp offset)) + (forward-char offset))))))) + +(defun js2-indent-region (start end) + "Indent the region, but don't use bounce indenting." + (let ((js2-bounce-indent-flag nil) + (indent-region-function nil)) + (indent-region start end nil))) ; nil for byte-compiler + +(provide 'js2-indent) + +;;; js2-indent.el ends here + +(eval-when-compile + (require 'cl)) + +(require 'imenu) +(require 'cc-cmds) ; for `c-fill-paragraph' + + +;;;###autoload (add-to-list 'auto-mode-alist '("\\.js$" . js2-mode)) + +;;;###autoload +(defun js2-mode () + "Major mode for editing JavaScript code." + (interactive) + (js2-mode-check-compat) + (kill-all-local-variables) + (set-syntax-table js2-mode-syntax-table) + (use-local-map js2-mode-map) + (setq major-mode 'js2-mode + mode-name "JavaScript-IDE" + comment-start "//" ; used by comment-region; don't change it + comment-end "") + (setq local-abbrev-table js2-mode-abbrev-table) + (set (make-local-variable 'max-lisp-eval-depth) + (max max-lisp-eval-depth 3000)) + (set (make-local-variable 'indent-line-function) #'js2-indent-line) + (set (make-local-variable 'indent-region-function) #'js2-indent-region) + (set (make-local-variable 'fill-paragraph-function) #'js2-fill-paragraph) + (set (make-local-variable 'before-save-hook) #'js2-before-save) + (set (make-local-variable 'next-error-function) #'js2-next-error) + (set (make-local-variable 'beginning-of-defun-function) #'js2-beginning-of-defun) + (set (make-local-variable 'end-of-defun-function) #'js2-end-of-defun) + ;; We un-confuse `parse-partial-sexp' by setting syntax-table properties + ;; for characters inside regexp literals. + (set (make-local-variable 'parse-sexp-lookup-properties) t) + ;; this is necessary to make `show-paren-function' work properly + (set (make-local-variable 'parse-sexp-ignore-comments) t) + ;; needed for M-x rgrep, among other things + (put 'js2-mode 'find-tag-default-function #'js2-mode-find-tag) + + ;; some variables needed by cc-engine for paragraph-fill, etc. + (setq c-buffer-is-cc-mode t + c-comment-prefix-regexp js2-comment-prefix-regexp + c-paragraph-start js2-paragraph-start + c-paragraph-separate "$" + comment-start-skip js2-comment-start-skip + c-syntactic-ws-start js2-syntactic-ws-start + c-syntactic-ws-end js2-syntactic-ws-end + c-syntactic-eol js2-syntactic-eol) + (if js2-emacs22 + (c-setup-paragraph-variables)) + + ;; We do our own syntax highlighting based on the parse tree. + ;; However, we want minor modes that add keywords to highlight properly + ;; (examples: doxymacs, column-marker). We do this by not letting + ;; font-lock unfontify anything, and telling it to fontify after we + ;; re-parse and re-highlight the buffer. (We currently don't do any + ;; work with regions other than the whole buffer.) + (dolist (var '(font-lock-unfontify-buffer-function + font-lock-unfontify-region-function)) + (set (make-local-variable var) (lambda (&rest args) t))) + + ;; Experiment: make reparse-delay longer for longer files. + (if (plusp js2-dynamic-idle-timer-adjust) + (setq js2-idle-timer-delay + (* js2-idle-timer-delay + (/ (point-max) js2-dynamic-idle-timer-adjust)))) + + (add-hook 'change-major-mode-hook #'js2-mode-exit nil t) + (add-hook 'after-change-functions #'js2-mode-edit nil t) + (setq imenu-create-index-function #'js2-mode-create-imenu-index) + (imenu-add-to-menubar (concat "IM-" mode-name)) + (when js2-mirror-mode + (js2-enter-mirror-mode)) + (add-to-invisibility-spec '(js2-outline . t)) + (set (make-local-variable 'line-move-ignore-invisible) t) + (set (make-local-variable 'forward-sexp-function) #'js2-mode-forward-sexp) + (setq js2-mode-functions-hidden nil + js2-mode-comments-hidden nil + js2-mode-buffer-dirty-p t + js2-mode-parsing nil) + (js2-reparse) + (run-hooks 'js2-mode-hook)) + +(defun js2-mode-check-compat () + "Signal an error if we can't run with this version of Emacs." + (if (and js2-mode-must-byte-compile + (not (byte-code-function-p (symbol-function 'js2-mode)))) + (error "You must byte-compile js2-mode before using it.")) + (if (and (boundp 'running-xemacs) + running-xemacs) + (error "js2-mode is not compatible with XEmacs")) + (unless (>= emacs-major-version 21) + (error "js2-mode requires GNU Emacs version 21 or higher"))) + +(defun js2-mode-exit () + (interactive) + (when js2-mode-node-overlay + (delete-overlay js2-mode-node-overlay) + (setq js2-mode-node-overlay nil)) + (setq js2-mode-ast nil) + (remove-hook 'change-major-mode-hook #'js2-mode-exit t) + (remove-from-invisibility-spec '(js2-outline . t)) + (js2-mode-show-all) + (js2-with-unmodifying-text-property-changes + (js2-clear-face (point-min) (point-max)))) + +(defun js2-before-save () + "Clean up whitespace before saving file. +You can disable this by customizing `js2-cleanup-whitespace'." + (when js2-cleanup-whitespace + (let ((col (current-column))) + (delete-trailing-whitespace) + ;; don't change trailing whitespace on current line + (unless (eq (current-column) col) + (indent-to col))))) + +(defsubst js2-mode-reset-timer () + (if js2-mode-parse-timer + (cancel-timer js2-mode-parse-timer)) + (setq js2-mode-parsing nil) + (setq js2-mode-parse-timer + (run-with-idle-timer js2-idle-timer-delay nil #'js2-reparse))) + +(defun js2-mode-edit (beg end len) + "Schedule a new parse after buffer is edited." + (setq js2-mode-buffer-dirty-p t) + (js2-mode-hide-overlay) + (js2-mode-reset-timer)) + +(defun js2-reparse (&optional force) + "Re-parse current buffer after user finishes some data entry. +If we get any user input while parsing, including cursor motion, +we discard the parse and reschedule it. If FORCE is nil, then the +buffer will only rebuild its `js2-mode-ast' if the buffer is dirty." + (let (time + interrupted-p + (js2-compiler-strict-mode js2-mode-show-strict-warnings)) + (unless js2-mode-parsing + (setq js2-mode-parsing t) + (unwind-protect + (when (or js2-mode-buffer-dirty-p force) + (js2-with-unmodifying-text-property-changes + (setq js2-mode-buffer-dirty-p nil + js2-mode-fontifications nil + js2-mode-deferred-properties nil) + (if js2-mode-verbose-parse-p + (message "parsing...")) + (setq time + (js2-time + (setq interrupted-p + (catch 'interrupted + (setq js2-mode-ast (js2-parse)) + (js2-mode-fontify-regions) + (js2-mode-show-warnings) + (js2-mode-show-errors) + (if (and font-lock-keywords + font-lock-mode) + (font-lock-fontify-buffer)) + nil)))) + (if interrupted-p + (progn + ;; unfinished parse => try again + (setq js2-mode-buffer-dirty-p t) + (js2-mode-reset-timer)) + (if js2-mode-verbose-parse-p + (message "Parse time: %s" time))))) + ;; finally + (setq js2-mode-parsing nil) + (unless interrupted-p + (setq js2-mode-parse-timer nil)))))) + +(defun js2-mode-show-node () + "Debugging aid: highlight selected AST node on mouse click." + (interactive) + (let ((node (js2-node-at-point)) + beg + end) + (when js2-mode-show-overlay + (if (null node) + (message "No node found at location %s" (point)) + (setq beg (js2-node-abs-pos node) + end (+ beg (js2-node-len node))) + (if js2-mode-node-overlay + (move-overlay js2-mode-node-overlay beg end) + (setq js2-mode-node-overlay (make-overlay beg end)) + (overlay-put js2-mode-node-overlay 'face 'highlight)) + (js2-with-unmodifying-text-property-changes + (put-text-property beg end 'point-left #'js2-mode-hide-overlay)) + (message "%s, parent: %s" + (js2-node-short-name node) + (if (js2-node-parent node) + (js2-node-short-name (js2-node-parent node)) + "nil")))))) + +(defun js2-mode-hide-overlay (&optional p1 p2) + "Remove the debugging overlay when the point moves." + (when js2-mode-node-overlay + (let ((beg (overlay-start js2-mode-node-overlay)) + (end (overlay-end js2-mode-node-overlay))) + ;; Sometimes we're called spuriously. + (unless (and p2 + (>= p2 beg) + (<= p2 end)) + (js2-with-unmodifying-text-property-changes + (remove-text-properties beg end '(point-left nil))) + (delete-overlay js2-mode-node-overlay) + (setq js2-mode-node-overlay nil))))) + +(defun js2-mode-reset () + "Debugging helper; resets everything." + (interactive) + (js2-mode-exit) + (js2-mode)) + +(defsubst js2-mode-show-warn-or-err (e face) + (let* ((key (first e)) + (beg (second e)) + (end (+ beg (third e))) + ;; Don't inadvertently go out of bounds. + (beg (max (point-min) (min beg (point-max)))) + (end (max (point-min) (min end (point-max)))) + (js2-highlight-level 3)) ; so js2-set-face is sure to fire + (js2-set-face beg end face) + (put-text-property beg end 'help-echo (js2-get-msg key)) + (put-text-property beg end 'point-entered #'js2-echo-error))) + +(defun js2-mode-fontify-regions () + "Apply fontifications recorded during parsing." + ;; We defer clearing faces as long as possible to eliminate flashing. + (js2-clear-face (point-min) (point-max)) + ;; have to reverse the recorded fontifications so that errors and + ;; warnings overwrite the normal fontifications + (dolist (f (nreverse js2-mode-fontifications)) + (put-text-property (first f) (second f) 'face (third f))) + (setq js2-mode-fontifications nil) + (dolist (p js2-mode-deferred-properties) + (apply #'put-text-property p)) + (setq js2-mode-deferred-properties nil)) + +(defun js2-mode-show-errors () + "Highlight syntax errors." + (when js2-mode-show-parse-errors + (dolist (e (js2-ast-root-errors js2-mode-ast)) + (js2-mode-show-warn-or-err e 'js2-error-face)))) + +(defun js2-mode-show-warnings () + "Highlight strict-mode warnings." + (when js2-mode-show-strict-warnings + (dolist (e (js2-ast-root-warnings js2-mode-ast)) + (let ((key (car e))) + (unless + ;; allow individual overrides + (or + (and (not js2-strict-trailing-comma-warning) + (string-match "trailing\\.comma" key)) + (and (not js2-strict-cond-assign-warning) + (string= key "msg.equal.as.assign"))) + (js2-mode-show-warn-or-err e 'js2-warning-face)))))) + +(defun js2-echo-error (old-point new-point) + (let ((msg (get-text-property new-point 'help-echo))) + (if msg + (message msg)))) + +(defalias #'js2-echo-help #'js2-echo-error) + +(defun js2-enter-key () + (interactive) + (let ((parse-status (save-excursion + (parse-partial-sexp (point-min) (point))))) + (cond + ;; check if we're inside a string + ((nth 3 parse-status) + (js2-mode-split-string parse-status)) + ;; check if inside a block comment + ((nth 4 parse-status) + (js2-mode-extend-comment)) + (t + ;; should probably figure out what the mode-map says we should do + (if js2-indent-on-enter-key + (let ((js2-bounce-indent-flag nil)) + (js2-indent-line))) + (insert "\n"))))) + +(defun js2-mode-split-string (parse-status) + "Turn a newline in mid-string into a string concatenation." + (let* ((col (current-column)) + (quote-char (nth 3 parse-status)) + (quote-string (string quote-char)) + (string-beg (nth 8 parse-status)) + (indent (save-match-data + (or + (save-excursion + (back-to-indentation) + (if (looking-at "\\+") + (current-column))) + (save-excursion + (goto-char string-beg) + (if (looking-back "\\+\\s-+") + (goto-char (match-beginning 0))) + (current-column)))))) + (insert quote-char "\n") + (indent-to indent) + (insert "+ " quote-string) + (when (eolp) + (insert quote-string) + (backward-char 1)))) + +(defun js2-mode-extend-comment () + "When inside a comment block, add comment prefix." + (let (star single col first-line needs-close) + (save-excursion + (back-to-indentation) + (cond + ((looking-at "\\*[^/]") + (setq star t + col (current-column))) + ((looking-at "/\\*") + (setq star t + first-line t + col (1+ (current-column)))) + ((looking-at "//") + (setq single t + col (current-column))))) + ;; Heuristic for whether we need to close the comment: + ;; if we've got a parse error here, assume it's an unterminated + ;; comment. + (setq needs-close + (eq (get-text-property (point) 'point-entered) + 'js2-echo-error)) + (insert "\n") + (cond + (star + (indent-to col) + (insert "* ") + (if (and first-line needs-close) + (save-excursion + (insert "\n") + (indent-to col) + (insert "*/")))) + (single + (when (save-excursion + (and (zerop (forward-line 1)) + (looking-at "\\s-*//"))) + (indent-to col) + (insert "// ")))))) + +(defun js2-fill-string (beg quote) + "Line-wrap a single-line string into a multi-line string. +BEG is the string beginning, QUOTE is the quote char." + (let* ((squote (string quote)) + (end (if (re-search-forward (concat "[^\\]" squote) + (point-at-eol) t) + (1+ (match-beginning 0)) + (point-at-eol))) + (tag (make-marker)) + (fill-column (- fill-column 4))) ; make room + (unwind-protect + (progn + (move-marker tag end) + (fill-paragraph nil) + (goto-char beg) + (while (not (js2-same-line tag)) + (goto-char (point-at-eol)) + (insert squote) + (when (zerop (forward-line 1)) + (back-to-indentation) + (if (looking-at (concat squote "\\s-*$")) + (progn + (setq end (point-at-eol)) + (forward-line -1) + (delete-region (point-at-eol) end)) + (insert "+ " squote))))) + (move-marker tag nil)))) + +(defun js2-fill-paragraph (arg) + "Fill paragraph after point. Prefix ARG means justify as well. +Has special handling for filling in comments and strings." + (let* ((parse-status (save-excursion + (parse-partial-sexp (point-min) (point)))) + (quote-char (or (nth 3 parse-status) + (save-match-data + (if (looking-at "[\"\']") + (char-after)))))) + (cond + (quote-char + (js2-fill-string (or (nth 8 parse-status) + (point)) + quote-char) + t) ; or fill-paragraph does evil things afterwards + ((nth 4 parse-status) ; in block comment? + (js2-fill-comment parse-status arg)) + (t + (fill-paragraph arg))))) + +(defun js2-fill-comment (parse-status arg) + "Fill-paragraph in a block comment." + (let* ((beg (nth 8 parse-status)) + (end (save-excursion + (goto-char beg) + (re-search-forward "[^\\]\\*/" nil t))) + indent + end-marker) + (when end + (setq end-marker (make-marker)) + (move-marker end-marker end)) + (when (and end js2-mode-squeeze-spaces) + (save-excursion + (save-restriction + (narrow-to-region beg end) + (goto-char (point-min)) + (while (re-search-forward "[ \t][ \t]+" nil t) + (replace-match " "))))) + ;; `c-fill-paragraph' doesn't indent the continuation stars properly + ;; if the comment isn't left-justified. They align to the first star + ;; on the first continuation line after the comment-open, so we make + ;; sure the first continuation line has the proper indentation. + (save-excursion + (goto-char beg) + (setq indent (1+ (current-column))) + (goto-char (point-at-eol)) + (skip-chars-forward " \t\r\n") + (indent-line-to indent) + + ;; Invoke `c-fill-paragraph' from the first continuation line, + ;; since it provides better results. Otherwise if you're on the + ;; last line, it doesn't prefix with stars the way you'd expect. + ;; TODO: write our own fill function that works in Emacs 21 + (c-fill-paragraph arg)) + + ;; last line is typically indented wrong, so fix it + (when end-marker + (save-excursion + (goto-char end-marker) + (js2-indent-line))))) + +(defun js2-beginning-of-line () + "Toggles point between bol and first non-whitespace char in line. +Also moves past comment delimiters when inside comments." + (interactive) + (let (node beg) + (cond + ((bolp) + (back-to-indentation)) + ((looking-at "//") + (skip-chars-forward "/ \t")) + ((and (eq (char-after) ?*) + (setq node (js2-comment-at-point)) + (memq (js2-comment-node-format node) '(jsdoc block)) + (save-excursion + (skip-chars-backward " \t") + (bolp))) + (skip-chars-forward "\* \t")) + (t + (goto-char (point-at-bol)))))) + +(defun js2-end-of-line () + "Toggles point between eol and last non-whitespace char in line." + (interactive) + (if (eolp) + (skip-chars-backward " \t") + (goto-char (point-at-eol)))) + +(defun js2-enter-mirror-mode() + "Turns on mirror mode, where quotes, brackets etc are mirrored automatically + on insertion." + (interactive) + (define-key js2-mode-map (read-kbd-macro "{") 'js2-mode-match-curly) + (define-key js2-mode-map (read-kbd-macro "}") 'js2-mode-magic-close-paren) + (define-key js2-mode-map (read-kbd-macro "\"") 'js2-mode-match-double-quote) + (define-key js2-mode-map (read-kbd-macro "'") 'js2-mode-match-single-quote) + (define-key js2-mode-map (read-kbd-macro "(") 'js2-mode-match-paren) + (define-key js2-mode-map (read-kbd-macro ")") 'js2-mode-magic-close-paren) + (define-key js2-mode-map (read-kbd-macro "[") 'js2-mode-match-bracket) + (define-key js2-mode-map (read-kbd-macro "]") 'js2-mode-magic-close-paren)) + +(defun js2-leave-mirror-mode() + "Turns off mirror mode." + (interactive) + (dolist (key '("{" "\"" "'" "(" ")" "[" "]")) + (define-key js2-mode-map (read-kbd-macro key) 'self-insert-command))) + +(defsubst js2-mode-inside-string () + "Return non-nil if inside a string. +Actually returns the quote character that begins the string." + (let ((parse-state (save-excursion + (parse-partial-sexp (point-min) (point))))) + (nth 3 parse-state))) + +(defsubst js2-mode-inside-comment-or-string () + "Return non-nil if inside a comment or string." + (or + (let ((comment-start + (save-excursion + (goto-char (point-at-bol)) + (if (re-search-forward "//" (point-at-eol) t) + (match-beginning 0))))) + (and comment-start + (<= comment-start (point)))) + (let ((parse-state (save-excursion + (parse-partial-sexp (point-min) (point))))) + (or (nth 3 parse-state) + (nth 4 parse-state))))) + +(defun js2-mode-match-curly (arg) + "Insert matching curly-brace." + (interactive "p") + (insert "{") + (if current-prefix-arg + (save-excursion + (insert "}")) + (unless (or (not (looking-at "\\s-*$")) + (js2-mode-inside-comment-or-string)) + (undo-boundary) + + ;; absolutely mystifying bug: when inserting the next "\n", + ;; the buffer-undo-list is given two new entries: the inserted range, + ;; and the incorrect position of the point. It's recorded incorrectly + ;; as being before the opening "{", not after it. But it's recorded + ;; as the correct value if you're debugging `js2-mode-match-curly' + ;; in edebug. I have no idea why it's doing this, but incrementing + ;; the inserted position fixes the problem, so that the undo takes us + ;; back to just after the user-inserted "{". + (insert "\n") + (ignore-errors + (incf (cadr buffer-undo-list))) + + (js2-indent-line) + (save-excursion + (insert "\n}") + (let ((js2-bounce-indent-flag (js2-code-at-bol-p))) + (js2-indent-line)))))) + +(defun js2-mode-match-bracket () + "Insert matching bracket." + (interactive) + (insert "[") + (unless (or (not (looking-at "\\s-*$")) + (js2-mode-inside-comment-or-string)) + (save-excursion + (insert "]")) + (when js2-auto-indent-flag + (let ((js2-bounce-indent-flag (js2-code-at-bol-p))) + (js2-indent-line))))) + +(defun js2-mode-match-paren () + "Insert matching paren unless already inserted." + (interactive) + (insert "(") + (unless (or (not (looking-at "\\s-*$")) + (js2-mode-inside-comment-or-string)) + (save-excursion + (insert ")")) + (when js2-auto-indent-flag + (let ((js2-bounce-indent-flag (js2-code-at-bol-p))) + (js2-indent-line))))) + +(defsubst js2-match-quote (quote-string) + (let ((start-quote (js2-mode-inside-string))) + (cond + ((not start-quote) + ;; not in string => insert matched quotes + (insert quote-string) + ;; exception: if we're just before a word, don't double it. + (unless (looking-at "[^ \t\r\n]") + (save-excursion + (insert quote-string)))) + ((looking-at quote-string) + (if (looking-back "[^\\]\\\\") + (insert quote-string) + (forward-char 1))) + ((and js2-mode-escape-quotes + (save-excursion + (save-match-data + (re-search-forward quote-string (point-at-eol) t)))) + ;; inside terminated string, escape quote (unless already escaped) + (insert (if (looking-back "[^\\]\\\\") + quote-string + (concat "\\" quote-string)))) + (t + (insert quote-string))))) ; else terminate the string + +(defun js2-mode-match-single-quote () + "Insert matching single-quote." + (interactive) + (let ((parse-status (parse-partial-sexp (point-min) (point)))) + ;; don't match inside comments, since apostrophe is more common + (if (nth 4 parse-status) + (insert "'") + (js2-match-quote "'")))) + +(defun js2-mode-match-double-quote () + "Insert matching double-quote." + (interactive) + (js2-match-quote "\"")) + +(defun js2-mode-magic-close-paren () + "Skip over close-paren rather than inserting, where appropriate. +Uses some heuristics to try to figure out the right thing to do." + (interactive) + (let* ((parse-status (parse-partial-sexp (point-min) (point))) + (open-pos (nth 1 parse-status)) + (close last-input-char) + (open (cond + ((eq close 41) ; close-paren + 40) ; open-paren + ((eq close 93) ; close-bracket + 91) ; open-bracket + ((eq close ?}) + ?{) + (t nil)))) + (if (and (looking-at (string close)) + (eq open (char-after open-pos)) + (js2-same-line open-pos)) + (forward-char 1) + (insert (string close))))) + +(defun js2-mode-wait-for-parse (callback) + "Invoke CALLBACK when parsing is finished. +If parsing is already finished, calls CALLBACK immediately." + (if (not js2-mode-buffer-dirty-p) + (funcall callback) + (push callback js2-mode-pending-parse-callbacks) + (add-hook 'js2-parse-finished-hook #'js2-mode-parse-finished))) + +(defun js2-mode-parse-finished () + "Invoke callbacks in `js2-mode-pending-parse-callbacks'." + ;; We can't let errors propagate up, since it prevents the + ;; `js2-parse' method from completing normally and returning + ;; the ast, which makes things mysteriously not work right. + (unwind-protect + (dolist (cb js2-mode-pending-parse-callbacks) + (condition-case err + (funcall cb) + (error (message "%s" err)))) + (setq js2-mode-pending-parse-callbacks nil))) + +(defun js2-mode-flag-region (from to flag) + "Hide or show text from FROM to TO, according to FLAG. +If FLAG is nil then text is shown, while if FLAG is t the text is hidden. +Returns the created overlay if FLAG is non-nil." + (remove-overlays from to 'invisible 'js2-outline) + (when flag + (let ((o (make-overlay from to))) + (overlay-put o 'invisible 'js2-outline) + (overlay-put o 'isearch-open-invisible + 'js2-isearch-open-invisible) + o))) + +;; Function to be set as an outline-isearch-open-invisible' property +;; to the overlay that makes the outline invisible (see +;; `js2-mode-flag-region'). +(defun js2-isearch-open-invisible (overlay) + ;; We rely on the fact that isearch places point on the matched text. + (js2-mode-show-element)) + +(defun js2-mode-invisible-overlay-bounds (&optional pos) + "Return cons cell of bounds of folding overlay at POS. +Returns nil if not found." + (let ((overlays (overlays-at (or pos (point)))) + o) + (while (and overlays + (not o)) + (if (overlay-get (car overlays) 'invisible) + (setq o (car overlays)) + (setq overlays (cdr overlays)))) + (if o + (cons (overlay-start o) (overlay-end o))))) + +(defun js2-mode-function-at-point (&optional pos) + "Return the innermost function node enclosing current point. +Returns nil if point is not in a function." + (let ((node (js2-node-at-point pos))) + (while (and node (not (js2-function-node-p node))) + (setq node (js2-node-parent node))) + (if (js2-function-node-p node) + node))) + +(defun js2-mode-toggle-element () + "Hide or show the foldable element at the point." + (interactive) + (let (comment fn pos) + (save-excursion + (save-match-data + (cond + ;; /* ... */ comment? + ((js2-block-comment-p (setq comment (js2-comment-at-point))) + (if (js2-mode-invisible-overlay-bounds + (setq pos (+ 3 (js2-node-abs-pos comment)))) + (progn + (goto-char pos) + (js2-mode-show-element)) + (js2-mode-hide-element))) + + ;; //-comment? + ((save-excursion + (back-to-indentation) + (looking-at js2-mode-//-comment-re)) + (js2-mode-toggle-//-comment)) + + ;; function? + ((setq fn (js2-mode-function-at-point)) + (setq pos (and (js2-function-node-body fn) + (js2-node-abs-pos (js2-function-node-body fn)))) + (goto-char (1+ pos)) + (if (js2-mode-invisible-overlay-bounds) + (js2-mode-show-element) + (js2-mode-hide-element))) + (t + (message "Nothing at point to hide or show"))))))) + +(defun js2-mode-hide-element () + "Fold/hide contents of a block, showing ellipses. +Show the hidden text with \\[js2-mode-show-element]." + (interactive) + (if js2-mode-buffer-dirty-p + (js2-mode-wait-for-parse #'js2-mode-hide-element)) + (let (node body beg end) + (cond + ((js2-mode-invisible-overlay-bounds) + (message "already hidden")) + (t + (setq node (js2-node-at-point)) + (cond + ((js2-block-comment-p node) + (js2-mode-hide-comment node)) + (t + (while (and node (not (js2-function-node-p node))) + (setq node (js2-node-parent node))) + (if (and node + (setq body (js2-function-node-body node))) + (progn + (setq beg (js2-node-abs-pos body) + end (+ beg (js2-node-len body))) + (js2-mode-flag-region (1+ beg) (1- end) 'hide)) + (message "No collapsable element found at point")))))))) + +(defun js2-mode-show-element () + "Show the hidden element at current point." + (interactive) + (let ((bounds (js2-mode-invisible-overlay-bounds))) + (if bounds + (js2-mode-flag-region (car bounds) (cdr bounds) nil) + (message "Nothing to un-hide")))) + +(defun js2-mode-show-all () + "Show all of the text in the buffer." + (interactive) + (js2-mode-flag-region (point-min) (point-max) nil)) + +(defun js2-mode-toggle-hide-functions () + (interactive) + (if js2-mode-functions-hidden + (js2-mode-show-functions) + (js2-mode-hide-functions))) + +(defun js2-mode-hide-functions () + "Hides all non-nested function bodies in the buffer. +Use \\[js2-mode-show-all] to reveal them, or \\[js2-mode-show-element] +to open an individual entry." + (interactive) + (if js2-mode-buffer-dirty-p + (js2-mode-wait-for-parse #'js2-mode-hide-functions)) + (if (null js2-mode-ast) + (message "Oops - parsing failed") + (setq js2-mode-functions-hidden t) + (js2-visit-ast js2-mode-ast #'js2-mode-function-hider))) + +(defun js2-mode-function-hider (n endp) + (when (not endp) + (let ((tt (js2-node-type n)) + body beg end) + (cond + ((and (= tt js2-FUNCTION) + (setq body (js2-function-node-body n))) + (setq beg (js2-node-abs-pos body) + end (+ beg (js2-node-len body))) + (js2-mode-flag-region (1+ beg) (1- end) 'hide) + nil) ; don't process children of function + (t + t))))) ; keep processing other AST nodes + +(defun js2-mode-show-functions () + "Un-hide any folded function bodies in the buffer." + (interactive) + (setq js2-mode-functions-hidden nil) + (save-excursion + (goto-char (point-min)) + (while (/= (goto-char (next-overlay-change (point))) + (point-max)) + (dolist (o (overlays-at (point))) + (when (and (overlay-get o 'invisible) + (not (overlay-get o 'comment))) + (js2-mode-flag-region (overlay-start o) (overlay-end o) nil)))))) + +(defun js2-mode-hide-comment (n) + (let* ((head (if (eq (js2-comment-node-format n) 'jsdoc) + 3 ; /** + 2)) ; /* + (beg (+ (js2-node-abs-pos n) head)) + (end (- (+ beg (js2-node-len n)) head 2)) + (o (js2-mode-flag-region beg end 'hide))) + (overlay-put o 'comment t))) + +(defun js2-mode-toggle-hide-comments () + "Folds all block comments in the buffer. +Use \\[js2-mode-show-all] to reveal them, or \\[js2-mode-show-element] +to open an individual entry." + (interactive) + (if js2-mode-comments-hidden + (js2-mode-show-comments) + (js2-mode-hide-comments))) + +(defun js2-mode-hide-comments () + (interactive) + (if js2-mode-buffer-dirty-p + (js2-mode-wait-for-parse #'js2-mode-hide-comments)) + (if (null js2-mode-ast) + (message "Oops - parsing failed") + (setq js2-mode-comments-hidden t) + (dolist (n (js2-ast-root-comments js2-mode-ast)) + (let ((format (js2-comment-node-format n))) + (when (js2-block-comment-p n) + (js2-mode-hide-comment n)))) + (js2-mode-hide-//-comments))) + +(defsubst js2-mode-extend-//-comment (direction) + "Find start or end of a block of similar //-comment lines. +DIRECTION is -1 to look back, 1 to look forward. +INDENT is the indentation level to match. +Returns the end-of-line position of the furthest adjacent +//-comment line with the same indentation as the current line. +If there is no such matching line, returns current end of line." + (let ((pos (point-at-eol)) + (indent (current-indentation))) + (save-excursion + (save-match-data + (while (and (zerop (forward-line direction)) + (looking-at js2-mode-//-comment-re) + (eq indent (length (match-string 1)))) + (setq pos (point-at-eol))) + pos)))) + +(defun js2-mode-hide-//-comments () + "Fold adjacent 1-line comments, showing only snippet of first one." + (let (beg end) + (save-excursion + (save-match-data + (goto-char (point-min)) + (while (re-search-forward js2-mode-//-comment-re nil t) + (setq beg (point) + end (js2-mode-extend-//-comment 1)) + (unless (eq beg end) + (overlay-put (js2-mode-flag-region beg end 'hide) + 'comment t)) + (goto-char end) + (forward-char 1)))))) + +(defun js2-mode-toggle-//-comment () + "Fold or un-fold any multi-line //-comment at point. +Caller should have determined that this line starts with a //-comment." + (let* ((beg (point-at-eol)) + (end beg)) + (save-excursion + (goto-char end) + (if (js2-mode-invisible-overlay-bounds) + (js2-mode-show-element) + ;; else hide the comment + (setq beg (js2-mode-extend-//-comment -1) + end (js2-mode-extend-//-comment 1)) + (unless (eq beg end) + (overlay-put (js2-mode-flag-region beg end 'hide) + 'comment t)))))) + +(defun js2-mode-show-comments () + "Un-hide any hidden comments, leaving other hidden elements alone." + (interactive) + (setq js2-mode-comments-hidden nil) + (save-excursion + (goto-char (point-min)) + (while (/= (goto-char (next-overlay-change (point))) + (point-max)) + (dolist (o (overlays-at (point))) + (when (overlay-get o 'comment) + (js2-mode-flag-region (overlay-start o) (overlay-end o) nil)))))) + +(defun js2-mode-display-warnings-and-errors () + "Turn on display of warnings and errors." + (interactive) + (setq js2-mode-show-parse-errors t + js2-mode-show-strict-warnings t) + (js2-reparse 'force)) + +(defun js2-mode-hide-warnings-and-errors () + "Turn off display of warnings and errors." + (interactive) + (setq js2-mode-show-parse-errors nil + js2-mode-show-strict-warnings nil) + (js2-reparse 'force)) + +(defun js2-mode-toggle-warnings-and-errors () + "Toggle the display of warnings and errors. +Some users don't like having warnings/errors reported while they type." + (interactive) + (setq js2-mode-show-parse-errors (not js2-mode-show-parse-errors) + js2-mode-show-strict-warnings (not js2-mode-show-strict-warnings)) + (js2-reparse 'force)) + +(defun js2-mode-customize () + (interactive) + (customize-group 'js2-mode)) + +(defun js2-mode-forward-sexp (&optional arg) + "Move forward across one statement or balanced expression. +With ARG, do it that many times. Negative arg -N means +move backward across N balanced expressions." + (interactive "p") + (setq arg (or arg 1)) + (if js2-mode-buffer-dirty-p + (js2-mode-wait-for-parse #'js2-mode-forward-sexp)) + (let (node end (start (point))) + (cond + ;; backward-sexp + ;; could probably make this "better" for some cases: + ;; - if in statement block (e.g. function body), go to parent + ;; - infix exprs like (foo in bar) - maybe go to beginning + ;; of infix expr if in the right-side expression? + ((and arg (minusp arg)) + (dotimes (i (- arg)) + (js2-backward-sws) + (forward-char -1) ; enter the node we backed up to + (setq node (js2-node-at-point (point) t)) + (goto-char (if node + (js2-node-abs-pos node) + (point-min))))) + (t + ;; forward-sexp + (js2-forward-sws) + (dotimes (i arg) + (js2-forward-sws) + (setq node (js2-node-at-point (point) t) + end (if node (+ (js2-node-abs-pos node) + (js2-node-len node)))) + (goto-char (or end (point-max)))))))) + +(defun js2-next-error (&optional arg reset) + "Move to next parse error. +Typically invoked via \\[next-error]. +ARG is the number of errors, forward or backward, to move. +RESET means start over from the beginning." + (interactive "p") + (if (or (null js2-mode-ast) + (and (null (js2-ast-root-errors js2-mode-ast)) + (null (js2-ast-root-warnings js2-mode-ast)))) + (message "No errors") + (when reset + (goto-char (point-min))) + (let* ((errs (copy-sequence + (append (js2-ast-root-errors js2-mode-ast) + (js2-ast-root-warnings js2-mode-ast)))) + (continue t) + (here (point)) + (count (or arg 1)) + (backward (minusp count)) + (sorter (if backward '> '<)) + (stopper (if backward '< '>)) + (count (abs count)) + err) + ;; sort by start position + (setq errs (sort errs (lambda (e1 e2) + (funcall sorter (second e1) (second e2))))) + ;; find nth error with pos > here + (while (and errs continue) + (when (funcall stopper (cadar errs) here) + (setq err (car errs)) + (if (zerop (decf count)) + (setq continue nil))) + (setq errs (cdr errs))) + (if err + (goto-char (second err)) + ;; wrap around to first error + (js2-next-error 1 t))))) + +(defun js2-mouse-3 () + "Make right-click move the point to the click location. +This makes right-click context menu operations a bit more intuitive. +The point will not move if the region is active, however, to avoid +destroying the region selection." + (interactive) + (when (and js2-move-point-on-right-click + (not mark-active)) + (let ((e last-input-event)) + (ignore-errors + (goto-char (cadadr e)))))) + +(defun js2-mode-create-imenu-index () + "Return an alist for `imenu--index-alist'." + ;; This is built up in `js2-parse-record-imenu' during parsing. + (when js2-mode-ast + ;; if we have an ast but no recorder, they're requesting a rescan + (unless js2-imenu-recorder + (js2-reparse 'force)) + (prog1 + (js2-build-imenu-index) + (setq js2-imenu-recorder nil + js2-imenu-function-map nil)))) + +(defun js2-mode-find-tag () + "Replacement for `find-tag-default'. +`find-tag-default' returns a ridiculous answer inside comments." + (let (beg end) + (js2-with-underscore-as-word-syntax + (save-excursion + (if (and (not (looking-at "[A-Za-z0-9_$]")) + (looking-back "[A-Za-z0-9_$]")) + (setq beg (progn (forward-word -1) (point)) + end (progn (forward-word 1) (point))) + (setq beg (progn (forward-word 1) (point)) + end (progn (forward-word -1) (point)))) + (replace-regexp-in-string + "[\"']" "" + (buffer-substring-no-properties beg end)))))) + +(defun js2-mode-forward-sibling () + "Move to the end of the sibling following point in parent. +Returns non-nil if successful, or nil if there was no following sibling." + (let* ((node (js2-node-at-point)) + (parent (js2-mode-find-enclosing-fn node)) + sib) + (when (setq sib (js2-node-find-child-after (point) parent)) + (goto-char (+ (js2-node-abs-pos sib) + (js2-node-len sib)))))) + +(defun js2-mode-backward-sibling () + "Move to the beginning of the sibling node preceding point in parent. +Parent is defined as the enclosing script or function." + (let* ((node (js2-node-at-point)) + (parent (js2-mode-find-enclosing-fn node)) + sib) + (when (setq sib (js2-node-find-child-before (point) parent)) + (goto-char (js2-node-abs-pos sib))))) + +(defun js2-beginning-of-defun () + "Go to line on which current function starts, and return non-nil. +If we're not in a function, go to beginning of previous script-level element." + (interactive) + (let ((parent (js2-node-parent-script-or-fn (js2-node-at-point))) + pos sib) + (cond + ((and (js2-function-node-p parent) + (not (eq (point) (setq pos (js2-node-abs-pos parent))))) + (goto-char pos)) + (t + (js2-mode-backward-sibling))))) + +(defun js2-end-of-defun () + "Go to the char after the last position of the current function. +If we're not in a function, skips over the next script-level element." + (interactive) + (let ((parent (js2-node-parent-script-or-fn (js2-node-at-point)))) + (if (not (js2-function-node-p parent)) + ;; punt: skip over next script-level element beyond point + (js2-mode-forward-sibling) + (goto-char (+ 1 (+ (js2-node-abs-pos parent) + (js2-node-len parent))))))) + +(defun js2-mark-defun (&optional allow-extend) + "Put mark at end of this function, point at beginning. +The function marked is the one that contains point. + +Interactively, if this command is repeated, +or (in Transient Mark mode) if the mark is active, +it marks the next defun after the ones already marked." + (interactive "p") + (let (extended) + (when (and allow-extend + (or (and (eq last-command this-command) (mark t)) + (and transient-mark-mode mark-active))) + (let ((sib (save-excursion + (goto-char (mark)) + (if (js2-mode-forward-sibling) + (point)))) + node) + (if sib + (progn + (set-mark sib) + (setq extended t)) + ;; no more siblings - try extending to enclosing node + (goto-char (mark t))))) + (when (not extended) + (let ((node (js2-node-at-point (point) t)) ; skip comments + ast fn stmt parent beg end) + (when (js2-ast-root-p node) + (setq ast node + node (or (js2-node-find-child-after (point) node) + (js2-node-find-child-before (point) node)))) + ;; only mark whole buffer if we can't find any children + (if (null node) + (setq node ast)) + (if (js2-function-node-p node) + (setq parent node) + (setq fn (js2-mode-find-enclosing-fn node) + stmt (if (or (null fn) + (js2-ast-root-p fn)) + (js2-mode-find-first-stmt node)) + parent (or stmt fn))) + (setq beg (js2-node-abs-pos parent) + end (+ beg (js2-node-len parent))) + (push-mark beg) + (goto-char end) + (exchange-point-and-mark))))) + +(defun js2-narrow-to-defun () + "Narrow to the function enclosing point." + (interactive) + (let* ((node (js2-node-at-point (point) t)) ;; skip comments + (fn (if (js2-script-node-p node) + node + (js2-mode-find-enclosing-fn node))) + (beg (js2-node-abs-pos fn))) + (unless (js2-ast-root-p fn) + (narrow-to-region beg (+ beg (js2-node-len fn)))))) + +(defalias 'js2r 'js2-mode-reset) + +(provide 'js2-mode) + +;;; js2-mode.el ends here + + +;;; js2.el ends here diff --git a/site-lisp/js2 (JOHNDOTY-1).elc b/site-lisp/js2 (JOHNDOTY-1).elc new file mode 100644 index 0000000000000000000000000000000000000000..9c3c4af610598e5ec4961f4d2b9331eac178ede9 GIT binary patch literal 1484749 zcmeFa`&%2wvMx;SHh!$wNftX-))*%N91CkM8i8}=BHJVw9KcB&<7LYrKru)}61GWJ z_Wswu_pR!l=^05}R`&VMFDK9Apqc6FuCA`GuCA)C{<69>|K8Bh(D0XEe(BA(_756+ z^)2t|k@s6`x4G5o9)0)y%AMtfmGuY3#f9pc*J^sV+70h+?Z_+5c>eUwa^{wwy+-HY#&4Zqs=g!91%Z~Rf~qCjVASU#@rHagnoVW-~l zwvL*${l=!Z)!OWI+l}T<=Q_T&J6*4~wS~?l?f5fO!OYa~L}S~Vs5Q5|iKnf@=GK8X zUMCtwgU00Wd2iw?lxWwtz04PH!Y_Igd-diHkjs3ToSgK&ofXJdJ74)hYjgMJO~Tt>bOlq1?tNC96Prc-*UX z>urDw^)T-L*?+^s!xK-BFpit8t-3e15tah{3$JVhe#tyU?nBu=#OLNNp+E)yV!SIw zpA2n;0u!Id5C6f&SW-t&s*HILHxJuw@J(^ARof!lbPYlFYrnPHcAUI+{rAI08;rME z+$T!-yH~^L^9RPL(X4x*P*Dad2)wQOcI|MlTQq~-sdtO!6&UZ47flXd{VwpQz1e+m zMb~R>d!3_ZxAxN8ZS3ss;a?Z5<#k)$LA?zk?@tXk8++HiKkDrkiQKI3fJvX%z5RNv z+3}jKW_@bdCkuAGr?n3FvrlzX!-1B_w85rZ`*p9nxnJ|19yWk9c=({*Ld)Go9n&D} z54B%w9_66651X4hcm6p%v3c0(w)WBO%{_2;@p-M?s6EBh9VeX<6u^Ve>wDgK;EhjQ z{nVTCrc1%3ce8tRfRc@7x4u(vdpCF5twT&5LX!HVUOD!bTg@WK;$e!l51UO=45)9h z!qx$0fycsA9tyViF~5&Il%4`=7z&^x1I7}-@wwDnJYWe=5%GP025g+~M-CMM7@KW+ zjeXGUIV8aMwdb|9&35C!G(VQ0Plh?H?bJKOzXJRZ_n)G79D#${CWH&dyV2Yt;>~)e zi@G{p%qEd)Q^RWzO`s$TJ=rYEC>LAX+hDD6_UTx1yQM+s9+{M_Z_=A+3Tg*l?!#p6 zg@>^+Vc_!Q$&Mt*xnFyhGDGp{;r4dDjk&j30~2t3T~tY@I7r4>$n(7QtnNM8 zs_)ey9lGsWV-MqAe6b6mFH{`&p4KsA>RzYz9Nc>nWj6OPgANaz3cT@d(xY?$#9-Oo?^;uD{%@W5sJVhq1(gC-9v$chF9|zC+AAAhXQq>zr92^5(9$S?ko( zs<03O^3&BN}E&DO!uje{E4*sFIprvQcuTJ2{>wCo*WeO+$hYj?NS z^%l|Hy}icw=p05Zt^T^lwX+Ih9iUavpI3Y4;G5X_WLg`gjX-mGoVh#FxRPgI}-itj^xvAJ6V!dS{XQ{Lh> zR~U-g>l~S3vtoLfdBQF#vmma7#W%tAH7+4(ZQv+jSx$)h)``6&O|S@25Ei%hYCFzY z1W}pG!vHDcj71b@1_Kj_b4IEZwCz&mZSJ;OV6EDI3xibKLyw!F07b_z`)&H%ANEB9 zN~4k3m|r#Uc6|$Ssl5-%Y+(}b9qu=WA<^)F*|b|fY(u}m>b!FZ%?n(CiI^iU7803= zU}I5BERlz6d+mB{>&P^R3S~lL>hx=q)0KTC;|Y@5%i$X4DJD58eO8A|Py}U)rM-~( z*g0r*f!u2SppF%YYVC7~Xpv^E?P1hm8i2wC9!Q9(Z5=_V8iKMUwZ%hLlBMoiUByTO zOchfUrp>w;{c(>9CMXIif3hg2u9blHFit#uI#KTXsbT>V3*%HFo!U26>)pe4(|cC8 zgCJsx1TbP8!soDg*g3>fmMX?nFd(1~yQBk{421Kr+3Cm_Sjl$clrXG|S%^`^f=MLC zsjHaPHw?=0sa7gKEV)9eU4M$IAwQwPQh|a-p+icsTW@Y9&uGxh2rCJc+yL#qsAFY& z+S~u zN2sWr5_WUm3df9d`7^?9YPed%diT7xcSv?Oqm4eH2o^R@YA^^?k!`R5u{>E1ljXGC z*ff0_pBVdd%p3a)|0eKn68|3J-y{6HiGN?>-*x=EHkN2vVa1PIa6V3EgyR_%1dsjf1@g`iHH$kjd+h7DGd)@rO)raKKi*#-SH(;{5LHw%T1W4d|jSWJQ5( zDn0nz@?JprLG5{3hiZfcuni3rh6V21fQ690zSZbqD29~q z`BsRj!NagzAWQEFj7PANyBEGbED-tX&5Z71899JJgZSi9%ylUp-;>m?f$R?swh}lB z!g4Y*2l6lWGrlW-w;CPU6jKg~8tDCg2&K4K?`+l%$Oh0NF^1R(immBH(J9+m0j?LN zCRcJs)Bo8T*p%%vCIaWW*=DH>1qreK$+nxT8;G0A5AgdTY!m73mO3EzHLy)l8Q?th zIAx$K$j0q-ee3*wSg-$4FPa^5ssxuyq8X~;;JCdSbl~+iBsvgCtPs@6p#+Mp>tsbk zh>Y3)LWC&>i%Pjm=yFg=jTpz_;zya)xW13AjTmA$-kV)j^k3B4T$(}IH5zI_P;#$* zYa|R9MW#EH4=8qqtweyU#z#H6bA1@L5u;&Z`iO3gzjnPlX&R*cHs~cdIKvS6+$^0u z4F2@AI}uowSA$N`_3Wlz6ed_3A?a%EHkOM$Fdw$GAOvYt3}707fO^`1qya_tuZxx? zW~ry`)(e`4X+9%O`I)+QRRuT%T4N{O{^}-^k{TwQtwU_4pB}=p2SuFQb^^WC~ayWoo9dHd4c?dP5%viI7uJDNo35!U5bGK<$30V*@ z_It1-?vYHwcciJ3QEY;p?h$6^&LJcaSCbBStMy`71u3UJwb|}zX|dmsEl-j7_M^m1 zd^!a^n9fkbjIgO4+K!=y@C}Rv*&PaaXR!&q^>sVhxpchFA#^=(+mmEJf?i_>)jgVc zIqCh`R^|WYU*p3E^%j;t%)>6`Qp>Pc+OX*UHSGIgEaGzAYCY3!9+?R;a9CR+%{#5; zb>T7cUgz)tTe*%JKU`wz;2Pc;hDrvLpPGktQ8#u~$g`8j!mSq;4<$npMv!)!%Z$6F zh=cHSGdU<{gqSmv_Zu(CCQ3V1b5sc_npYT&?zqg-ZP=M0xRf0!nz>=Gc~7+9xNIwu zN07LMbzPS6;Z6-g(GHq2Z-bTU_<*pKjM%$EbAjljjeAEYyqJ+XtzoNmfyc!RBC@N| zgsxSmVQm8KbdI3X?Hk>X14YdbtUq~@$TV^Q7CI_^s01br?NXm95XWJv0v{&~f-s{* zI25nH6dt1gN;jAgViPs*Ywzi#*`z92uzDTtZ7G$Xa{D&^_1B~*Fs#8=v5n_(xy26D5=i@AD=Z2iV#Xrt>EJ7zJDM#Kd>u6LV z_ay74lBL1=3eC3pWUbzHJbB~U8to=;I+#vzfV~xl z%kd*x$6*q@fCUmXZ0$6~Ix(-NVl1DnCjRG_OV>R=F3FndWA<_5Wfm<;?#&h~%d|w0 zZ--Hp(~>_`2JBR8vSD1(ACwSs;J)> zjykLsGzjR2S?cn`U^y@aTw)ByIC*d^1rmS!I6G!t#?efwsSF+!c-%{I#@;J^c;6H%_ZAJjl>CxB*ccNayD8uqUDb8VOd}KhgS44j)6uMXILq(A;s%*2yhS)${Zz$STgD`Vr|k)Af8Y36vVe8 z=jGuZ9r@6j;j=uMDbm)8yXYIMFPiEzJ)7|>)2EXx;13&AfO%mlUGr9V8_gDUN+>L_ z&e6_+O_K}}1lcCX7>eHEW*0t9DQZELDz&F@QiFF;<#vl(C`_Rz&H9URM*&i43|>@* z8#a4gYhG14iPZ$!KPMIpgRLgFZb_sD)h}vQsM*${TR{32Nq?Fe6I5Gm%;q%-IuRx& z)K^r>lc4@2O<)ToPl(=$cX>6qeQ`x+rE^hSIg05{z z88mbydl7xaFd5$&iq`gC)ZhWITI(=p^tLH%f}|ksDyzYX>zK}^HW{G^T8WAaH&sHI zEXTo`eJYNdj-!4Ym*F$RQ5qjai>%cWtS}m0URkf+^mIfpC{FjigFQr+?6&r{>TMOj zVkD&{XIx$PB<4}Qi(RSiYGhcI?7iF!{>-3ehQ|&D%zDooHDN+UdS1gAhV72^iBR!w zopCQ!u+D79uH?&*tK4y{>$V^_%U;56BMg>w{i}VcM26uT@ascztcGtr@~~g`zIxi) zI{L-~@BJ)c4NiF)fv||dk>%`3fcvXHBojsktGd*Y_vZoDM$VYAl8nhue}-77>U zyVCTsT?b|arY)6LdAcdE;A}V8ETjP~H0-a86onNAdIwmOk95bxE>UdMK#(JZqrom{ zv?~fMe#tb5F;W4bJ_YK4*^#MDJ)M}G+I)yGw~3cn`8gQa%5fxsN4x%_-RRPCQqvK2 zihrH7YyklWFpWDQotiK-!qc=*doB8Mh|L2gxvn6(Rx00tWU$LX+?;F?(RuA~2bW1p z0a+$9Gutnfg45Y{!@ygGzmL%}#vMSKr_+xTCm)DrMG_-kOHmLdp=fw!ELt`s($`o= zMn?J)>-aWe9ZMk}@h?gu9m}SGhC!x48X&nbW}#w~t7M?0ME@X3>epSwVl|6!9%Cmo zFy7G@|6&sVmks$!Yk_aZEBcSTP$FqaJ6bZp%aqTZ5QL{$F`hbN$aafeLvXx02-8Rxgf1C(E5Hg zrf39QqXgF|#WgaxhLLZJ0@owKEX#`Jbz2T7mJ<}q zDT-x9@k?6{_{9l+af)B8_oj$WIQ)&o0Q%1_X;)0`jwf{NjK-a6uke zkf@Y^JP;5pDteRxq<-jvJhUKjB>{OTAR8MF%p(`(k-`*Svn=vR0RH8af9#fjtmQvT z%0HI!Pn_~Kw|q^@f0dN4N%^Nv`AxU{rj}nz%5O^fEvJ0lEnnC2za{1CQhwVhzvGtQ z(eh-|1Y}1*b{&w03(~M4VJQK@f{hw}b3mTCAkQpFxsrf96OcUzWZwnZHy}7ZlYs0C zNYepnxgaeI5|$H?mVg{MAiujHzgv(vNQgG;CE_gWyUbf(2;DSTRQ*bDTE_fveUa{b@?}9@^5^z7; zcR$y6JWJoty zz}|IXZGVGoe}i0q@hq@g4lLejf2r3xqz-cZ#k0Wv>B8Fn2HE}wx&Go=V8Ne(3vRni z_1|qe*X6*Da!~eNaNFxJ+v_mbYdmY~VX5SR$SA0mK^zy=CO=mkE=Q@sOY5H>)*7iEi_PUbmHJ%0bYX=tZwB1U!%avT0@hq_G zF0AcuCFw6#J=<0M6o|S);L$Xcoh+5yWWlq5{o8HGPL@hCS%g;D`PF2YI*AFhN?QgpDgYcG1@KZ;4LqTX6Cg+4)_0tJYo0bL9&xZSd zcUnT33mKRkJ6Ht)4a6=O2(z7m%Ss0r8_hr>h~9-W0s^O-vZ!VS1Zjid;nJY>LgeTVK~z+rt#8IdZ5 zww~>KnCm;91^g1z8os%-f&IpXwOxkh zkb%v08M=eO-gjYbe`(xx+s*YCx`V*(xv;jsQMSK1T>*wtg+&KL2OO`p%g_tlrpvi5 z<5`;C2*SVxx4q6T|1hIwsf}j?9{Vo1?RYuc@p7)?cvf%>vkPwfUe5MCxBSz%Y{0{c z18$f9FwXWpxBSC4Yr$hlq+vJ>ua$J!mkw-0~w@9=couUyCCmdkaC!Sye}XhI3ORoARihKD3b}uhXV4E1M;y8^05U8{RHG=0fD0`Vf#@R zWYmJhr37SDK>q1~crJ*iAa6lAF+#}`fGZBb#+VC%rz>Qu(G&!)IObO!m``1hPZgq^ zLVPL!pE&@Zy8xdnz)}kExd4ni02402gaT})022Z*=>S}F0j?>)A1S~!0rCWh3lmwGvNJ63ngIsRwge`2VPb`O{i5X+_ytkE;*_6u%TH_hkCO7!QhvrM zf7300Q_BZQ`I}N6j?@I7uiWxqY5B#Z{8v)`Yp47-ZuxJt{F9{oH&Xsvr~G$r`R}y+ zi=_N_QhwGcKj)U8)AF#M#tF!rfXq7}3ogil1&PWD$bx`W9gtft$Sn&}i4u@o0&?2{ zx#NP|F(6?OCLnhNWYL0P39}0*eqO=2B0?iFEpUCqK*Lj=48#v^{Xf|HE9uz%@XE#Y zwD^(~M;&*i*<}G399C0ZUazkHytsbHV{FT6_15F%wa3e|cdPO|ySBD?d)fK<`0mPr zJkGD&y$e|RU0q#WSv@W+2f;8la;9W{EqT5d$nT}<>`zs}Ae86T>iYfFWiOJ4+bioU zURi!F-m3oS#pdU7)vL(Qwd%THJ1tLhi|fE-#{T{V55BgDFSE-Fo^LSu(et%+RD{$G z#BOQb^R>|>ywf&s(dG?p$@%ixj7|_0`4Y+g_w7E#C)BqzJ9wSzPmwCV|M^nq69}dXZwW zzIq?O6@|4s812Zke+Q!!Y2&Na+tpw0d66COS9~DoE0~u|ce_-u=Ub|PFUz}a?DvIKR#p=?6S5X8Ps<&o=3`b<`-t0W) zsG?e3oB!qR((L;Bs#j4w_02l_T2V|{_uZ;+5YpAz)*y`ROFRCMP-MEwv{z9qB?C;6 z;fj*Lk)TWmlYO(k`T*(vq~5ja-9>L&(O;VLrWN;9{4&fi?@cR~tN5kZE#32`4OaN2 zs89sXdN^7>t$3)gd~9Tpww1o4ESk|q)0Y%UGupm+N$E19c$ha7EHh?wMI1jCSu>-E znL-pfGm4;jL&-Cvh?+MPKr=ed<_+c043eLg6j>#tM(PTsgpAJfot2dzP+EI2zp}Kl zj3-53B(1@la<-%xFD}pHx1zdGx)vCnKr-NTUq6IrR(Bd zeKeAM@fM`GqEMyq@Qoy2!x}OVd2Gb_{H%OaGz??nqoVTjoka?HBik2N@YCSJei-RK zw_2S=ca4CbUs+yXT!w)1jg+TA@Qs+4<;ypMUc>`FDK%~_E<;{Ez_X(A)5;>qV?;hC zZ*}#jDqkpFs(0_Lv#eq>2e||cjO<^UovUKmG~$1Kb`^6OiAV-)x~?PP3fa6h|DwJECTn}s*fQyiBG85nMLEVG^`_M zRtkNkqo<GUJXh9#ykEtX_RVr(#fxv2 z3_MrKhGx}RUwN#O5N{MyyjfVeKSwSwYll$NEFI_vQ~)LBlKfUK2NSIEixLo}>SMj&;W|Pgu3KZEJMy?y z$JufmvBDuRWTvd+Am7AZZU5<34PnRr*H>>MNLr5H6ubKejE6>^P5Wv9{8j%dlKmpj zm&8T0G*02*49hrvnVgw8Yq*J|uv6aEhZ8*1r3dVBK1R~9OiJ!tL?gl((U(TLZPt!Aq0d)1L2T z{slRX59)Nf$Y|tgei9sokOY%9y$mwL;Djkoli{E}&Q?g4wQRtAx5Ja9-6Ku#z+7mW zw>5y7q0Hd!V-S~2qnQfW0nDLObf5_fPEtH3l!?ogQ#Nm)|3>>{X$%e-yp$kNnLaJ+rr>`Qhh_`gK09@A zRPvMrVEfJ1-)tM%47Z9*W0s!H2%=Ktp8^J&_xFmmE@n59N8$`oDp;a0IPECqtN9xk5gk<5t?eM2 z5stnik(!HBge1AAo4LIe{Y|WJLas@?IzWus)RXBHA&1Qwkjm9Vtgt&c4MQz4Z9HTN zS((W`kwx7*JkV3%Dw!#wxd!rlU6-q*9B(#DEOm)QQkw%(8R9Yn@#%=G65G`AH|T2g zhoYooaL1Wxnofs`TLm$J9%t!fGNwV#V7jd>ZwrZW?HYz3$Qvz5DsxkkZ|hq&-I{|` z8QYoDAeE^=Pzn;1OnxOKBl?e!O2A#T0-UHn1+5HPwh9@wc*Z>!%n8RN0+OeWl+uIU zIP|Hff`y(qAByY@%nN~Igh!J5UXFlzv(S$vGw)MoHY0E1z%Bb_skTg#zTrm!1s zO0HU4lPjS$b;KYE3 ziPFTd*lI94CZrN_Z8BY% zoUP>to?sOUw-teAoeXD7+hkh#>1fDUDT>B{+p9HV}7qil*4$6fjO0 zH@1&7=c7djS#KN20)k`7%Q%0`;-D)MIN9&KD1^y4+U>&wll9vXciOJ0W2*=KxD=AM zNZEniyrgSH%`fWX$YfGy8dIOrG_>L1r=D@Jb0S=s&ZZMszcC+%bY_pSlzs!#$id~ z&%@)-k;2;MDqvG4qiS|Df#sFG(@RerK@$7Zr;`6Jybuo-VVlna^kch1_ckY$%sR~k zn>&~+iO+4CX9q}#!t@i;E6M|2aDcf+_-%@)Z6;cSK)^wFrLxK=EY3{Euc!Mp3#~~& z28qOeO5*rK;c`;VAPELSR;9Km8=5eb$=twEI2nxp^N2hxjNI$;W+6!|-NRx`3POqC zCG$2em#D^Jzc+)chC0u9%$?c#c(n$P5Icg6_bu4@CR=yer%Pd^K`!nSIxd%Cp)m?{ zT$xtBg;nJiP$1*3sWFz2#HusLzNPeq+)gazj3CWCu04Qy8L)%yCg0@MC34Hm!SZ; zgYZ&7fXo3=0_g!!oMKcUL{w(a+)DugGBNH1GBNHJD05((rWq+9Kqi2bB{YB&2e7my z_$G5Lv48*>Hzt9M8xvkf3rEXO=6t`D5jb=7op5sIA0eVV&!O%06%+1K z8GIWJmGY!wC=x}R1-gT)O;l`UiZEM28y5g&@-3y=I8<^NNu_(cWKGD_<6c5$ZbwpU zV}gw7C04+qktCT4xCOAegEJqHgbjHsZC*L%xlsKpQz#)}>#6joZ8lYzLbw^E@m#a( zNg^qewgIM5yH-D8d6DDh$}rUrY(ja{mn6}Kq|SF_x2h9x7ug|5O1etUG;GPeA_UBs z-V|nL5m{en(Yxd_a&%;mi14I|ekE&`3`@&o5wY;Og+Sb-MgS;;Wo9c#ID3_uXAFc) zktA;fn@I(UkqHD+nSkTUf><_*gaGBIH-U6|p-@b4cQtBoTq6kYND#Ix) z0%3i{)UXqfPb?tJs(tbaWc%ssN{H+!x-zkxS#>lEih&Ij7THd4$iTkS8H4ay92GF{ zY{n9lOEQ*7auY7v%vh4`kd$GYp_%7|(|OM5aZW(OQSf94A!P(E9j7Gi2?N9xj!H^~ z7E(swjKE`iD)0b;_;!WE+Z>#f=|6E#n6N1WlDCoO`arnRY>E0Ux775Lve+RMJD3KW zy8_1dOyXyfBkLxCFKHp>q~~o9_W7`hOh8a$ajWK;9BiyBg;nR8t#b?8nGP@1bLtFE z;k09&DeTpN4m)*H@{4xIbp(c|tkXhX4OyeQI-MHfKjgJEY5$|M)ob9dMyy>urL5gt z+>usWK4rBA@M@X$smm0;4ZXb3>@`T~Mze^$iR8_b(L{j*NwTF{1~zpprN)6ycOTc} z(W0C8ezMFCuGDN|GhR%pfCrQuHU?hjd<@R5Lp=DGC^E#+NvNc7(jL%(5z8C<^s}uo zT+I0hI}+ShrFRkbX=7ZrD@I2Hy83L@nMPCGGH?fiy}5~EoW&Y<%uJR@Ne%?@2aUqJ zDczJ!n>FvDuP9)xA|^+sY`gbc9i~3Sep$1f$rjJq4BK5Q%w`S=6Z;GI-?-h9)|EH8_Z!5f=z- z)~xjf?s3ySiWxN_z>KrsQg^V_3Nj)Opd?|}4Q+czZ*76i=>bx=?&D4fy`2G9?bMjg z9o9VTL6I#Cd-)eFPz!Ks0Zgv?0Cr-X5Y-p+lPWQnT&%n>0ca9An-|t(j}#ktZI_wR z8{5PD_yU$MF=x=UBY;9AjE-FN!`(MC`QwTZd&AfDs*&1yru>p>z0KzQ`4thlMMAl=WEPwvo6SDWMO%mvXbP2T>R# zJr8HflaN=CGKiP6c0NcKbNdU344W)=YD`7B?cK+X+Zo%I7~Npofz4cWPNoMpcg%45 zN!ngsT7?^Ta4i7sd15tWGG9p^D_1vgBpgGivBnQ8f9uuIYLDM)F?plh04fzBFDuD* z?6tLoG*G*c7!Q7LaL!d7?Mu|ot4+`OaX4;tPCSBnsx8K=6K&anmko6TlE0 zPCf=okW$)nG1sFwk`3!cp8f8a#3do*9@dJwxX|^v%Tbd#KehMN0z1h>js=d3mLw*n zq=9osF1(}&MXwD-3~JYhvvgAyB5H|&zL}DijuPB*3DZ08hLlB=CS19iQbHsx$;9i* z!~5*w2dN3>MtILz!4FA-u*#cJS7-WJCTo*2&s9z;G?6l@Pu@bk`H zA_Ar`7m;Jps6lt;#MSGCwG}Kg<04+=+A!QufUAd@_?f;zz0OGN_xX!sFpEvLSmI`; zg1Su18mPAe3VD?lV*Rn4VTHGj7G{qugA&t4{&6n;#BD2_PYTUjMv)H}&T~;;PA>~& z;ubYF7QTg?JeZzIlk^{VjS8Y>%NS5`o!JS@Yudqbyzw-}vweu=93;GzTst5G3^o^7 zAsV)Wp%(P^RxfsY83-`zn zxb)_fV%3>?2#XxTI&XU_LLJ~F(FHP>rj9dRG;WT8kO0@|TutiE@Q4}4Bw;Tb2fund z!f$|Aevyv3$hu@zo~#-A+nmFevO*5K3DRuMTx(>3R$kTn{&F3l2t|f|X;=r=R*c;x z@20^(?{j#eF123Z=IeBrRm_OCjU|S&4|7L}K$Rs^8wFf4YRGObH^ZhB>PK3sn3Gx4 zup2q*v@cSp4PQ7J&s5I4Wi{(_zve9i3ayYG-FRWu^=TdGN+wxK5iU3`S~J!VD$g7- ztOgJX*I`OCx;uLY)qt{xNT@Rom$KoyUbL4uGLcOD8DaRsP`eOygU&8x+{yk*nTpo(x(N)&P{&DcN|XLl?UW zNNI>uURR1?hD|NqKIGi4Lh-y0It*sQehw;bEk#+wCJKLH#wo>D78dY_wy^9gzce=o zlM9ViH2#L48G9OE&=y0x7A;ggA5j(EAT(9=d_)Fc9A(2lwdQ224NxTxLLx$}4XK|L2w!(d4P4n|Pa| zyqK5}eTq7Bi-Fl>K;AMArrc}n>~>+*aCQUzRQ$0PRJWZv!fXduwN-0BLroJC*oZsT zp>}KxZgGpjb;!Ao#l{3pjoHg^*)%7R#~-?hH61vnUE76;o2b8T`Zb1YlEws^lM(I< z$4>OtH=rkiY6txw-oJIWTALC|XmIa(nVQ!2pg!NmJu$>j2?NO~F#yR%-usT%Ugr-m6cd)-RW zB+KtVbPHhdl{Pd};jKYqXX{E9k9?CG&1FUvB{v&!_zfP2LWA!SQ5|{%M1M3+M`o@p zqVAYFaZy8ew}qR3$V_SfPl1djVv$u27>pfW!_h=|;c=tUgOaWJ3`ptp+U+7@m*Kkf zBUzO4LSi2lS&?}ioSN$|_i~fG)j8tzs=`te$5ofD&5FLvJU_xEQmq#x#~EtsFUp5=EdbIC^=^+Iatc6OygKm%;}Xc zt`JQ|8CR+|aOnk%g#*@uGY>U8MyTh z#QJJg`Oefv6He(qUt|w}TWoAe*+V4o5-N;Oa`jEUyMaq@WFup@fEqdj6^Aj$d)WC? z+Tlu^=H?zwVZc%$1$1k{U4&w~(FB&})?C}JF;_?-Y<%kQr$Z6YEx4LIxZP;A8#|3A zO>wj{Z#0cf1@~UlB{s-LGXudG)W3JkG0KSnug1%`|#lHeoUCYYWCR3IQdc}RCyPM1#)E9)AH>f8l zXWpQmAXATSY1}g0+=Q8WbXSupgL*<+5BD^3vj?4p=m(O>vmfWabIM4+q+oF6I~0nM zb6xg3QRLPuCCXaj1xuiv$hISOAQ=vJHUe{jjnPGkf@X_jlO!q~?e>OyOkBS)=eEQx zPdQUFZrMN*H@6J#(+J}XC2(^FlC5RRpq@BW4{pOiS~Rx|F1-jVnR;-yMOewygDWh; zidzrj4slZj{y#h9)P-kUMuGp&=icJJ3B0Z9+w<4(Kqm+c@*P+z4rJ5Nu0MrsgmJM5 zF4$w3ogTY2*PhdAB9Q{RGot4Mad28pLK!+@GT;l=NMn-P`uN6s$eXX~ynx7Vu!=D2 zy(lvD#v8k+D=u2V^2*|4ujm`xebi|3YA;3Xc5jii>Hq5e zX!oK;hHmI~&U+XlYlUB$o+*V&IdRF$M;ejZaNl%b=2zhcyAAyH`Vlv$J)^Dlu<1R- zf%m}25vSM?KmCLY(4Zh8*vk|hd%wA*h~>XL+=5DqjWGw&pkf}#Kbv&GVcf9(Vr~aG z3Jq@?*ix8`+`ut)xPd%?EegWhrL$_1V{`!cq~1I%KBbpE*&jUe#?mc2xVBFbV}!s- z1nhlv1CQ&`q##tbeQ#|35FYb=d{6k#8346l@Z(KfyL#Z3rU5STyNJCP1~4+r*kpf1 z*gQ7vn|1iUx8dwU7@CX6Es0D}w*-6*Qo_N6L9W<7D;BE=Dd3STS>g?d_;aysq;p~r z3Y|K4n(%xVc}Lt>u{fw;$}d?Ym%&Hyf3!LAxQYu)8NNta?54T(5f`Atiet%+SU#v| z0Gi+%<|Jt&=D_l^TMFuBrikVLOjX=&7;@ajxhpCi#JU%|0mA`bEo|;bru}R;*BC!w zCK|h75pc%Cg4<8-+`Rd`(P_Z(ziN?v<@T<3`6G){1}37Jq&G=_B*2RGh)XHS8M$ z?i-l{=`NQ+cq41xjT<(4N#ZcD#l4FapWZi()!?Z`+;eKvpFj#zo17ZH)o7y_A`}rP zOS}C6H{e|K5$(W8J7`%JC>Jy(n5WIM>tp}g*qGSZ=oGJQY)sy`G4+Mb2@;hma)KII z&v^ILzM5?D`_;=ulp3@KVMV2BIrf$xChA%ye%juVfQ`fPap$qo%8bbXfyK2gz1R1I zcx34>@k+*BT&B?KctmqRJhF+wKV`3V)ucnQ?e-q&txk2$TQGF$5H2|#y;Zw132$`s zVn~m)Ri`@WD~)HXIYaxzn%w4$xgSmsa*v*M%oz_ShY|WuC_gBM3L z62^)2X8CEC^-;_4WzN{TxrQQcpLi1L7*a`GVxMY+3r^KMrV>;@9FcL3{<;h?Bj;*Q zheMybPK5~O9`;`vV49tUFs7U;Gex$BGc;-!DjfUG%)r3c8JIiB`kx5Do^v*OIWz1( z3@*U=4s-m)?>QzThdk-I*NB1in2d=gHK&wLElrh5nJ$x$G0keY`1}BeHY9V=G17Gm zYt46NX?*m>#>O`r8~^?k>yBzg$$jL-7feybEJy(8cqnw^;k6r&@b}?H^CJIl;J@^D z=L%kZb){IuA1r5B%ZkNs`qYU)^rS{YOO+^p1?#iDV|u=I(14j#_N?5_%k0F`yo?kP zd{1?pAtald#d;Hl9xT>Y`^(Mxv^zYuEj_^+J8@%Un}%KDmMgMAKxSbo7c<4u#WC|5&|Dzm*ySiWa`ME|Zyeb^n79TO z5|hpb;ja={htw40f2O9$r{xnC+s6h#65`rYFw`I^Pd`>miG&T2p8H78QzSA8)*56o zgO&y(6gCz>0tq=F$0XWQ7@3=gKKVrbGLAPLmcn0P`FaWen=pft(ir`C%P~v4wTWc@S8hjoAB~$HrRZ z74g)2bQ*8bCjA5ifsaM0gFB!~l^@0BMhkVhF!W^d!;f&a0Tdi0n-EtU{sw+jzwnn( zvRVI$AHU+uV59j|UV<8j<_D{m>$t)nuW+KWWOEH4{de#b{4)pV7H17uzOH@yElN^5 zH(k*VAax!^E7or93Jk_L%vnS9kI(=HJz0Y%zP&j{p$#$p^%zbQfrdCP`i!LF$vgQl z4(T0xW9B#xcf*{ym`ajs#vJ4_k?v+w4OAde#OcdJ8;r5nOyqE0FEtSU`6O*+9IoNb z`hnR=V+C+))Ywx@jShlQkVXdJi+7Q)TPCt1(mB9Tb(qtQdvEO{&%NONCNd*&($zc! zSTyzz;bs<^@SV*q2yZol!k@PqTbiJS-(*iOk;))~9wQJq44@uc6C{AlMsso7yS-Yi zEBZ40N+ zlr6DJ<7^KWO6IXcjt3~%Jb9&2!Vn;E=))$Aj&cMj3&;87fj|`nZcNq?6nfWnXQglsK zJ|r1F;`e_KUHI-Dr41(k*u}5;@=(QG^NQAi`_U;cn^(?@1X$yvO2{Ti4ta=z#`}u* zps|)tXe-s}tx8T=5M4f`75}ak52ygwKZzD_VV20hD;*sh`hwlTZ%PeIn3i|-X0f=r zSKMkbW?hft7880|QqyH9%8VTwoU5_l`i!wVB3V8}Ocdf7?P!UFnU_pYbGWmCE)^!E zPKOwWYIdRY36sJ1cjQU7Z5|xZbAh-q0P}H0`2p%A1B1EJ5&`DX+q%IW!vXT&qL|x+ zSx~?|6d1^zQb*JaM1p$nj0;(PEaX|_7DIq2B+=L-vspog>{a1BF}BlX2x)~wG#!;a z_g1S5i^y?arIy6gB}S!nP9z#qK&F9ZG0`;%GghKbmu$*74}@p?{)Zo(ze!H}=g@hu z-?j{GDS981@WR}?=VgR1<9qNHZh{QL$`@vYzjYqyt==S9yxwd6~8i z36Jhs{jWSz^38EZAE~F{bM;E#1Ds<4ZLJ_BZFuhmuQ@SYrCS5Ci6T|PkDkDw;9N2#%4}7@KsN=JoB=|8+TKp zV-LUYtVCRhxFnUYNMsYQGAvc*&MlaW!rCnVY+1*CI@) zZVj`4hYR7pu1B4teT1fXaA{LHBsN79fP*{p3QGiEK{O%k(Av3K7{25iIBA0oA}Mms zD|!=1^In6TWS{dz-A}kK0>(FQLjF#bCLiIZhJ<5cqzh(>_B649(g{WmCafp=Mam_w z%gqjMCoo!=cy}i1zcZ|^?aTjR@y$+^CO&h9I3*xW&VOz7Mdw3$bQ#G9U@=cpEwGL= z=2bueRjR#X38lb3WOoK1MIFQ^n^iXuiEbbhm4r8OGEX880BTF_CNO%vx z>E#RHeQa{QU+}ADb6!xVgOw&dD}Gw5<<0DYV0vG0X83dB0dTM}r3e8-i{~IsS+VCLH~{e zg)?>?*}T_sduvf$aZnZ!qf86}1r^)wLquF~S;aab89@(f-Q8YV@DuVP?|=~8T2R}< zZc~k599xNQ@Wyzan2ULb(LYd&q4U`j_faK=%Y(g3Hg{q-FzF6thi$@}z)bs{9WPZ4 zarjJ#xL0qI#m-aW@RDS#7~I*#Zx3C(@N2d3<{Vdvkv9#$u?`C<5`_sWDN-OjG|QBv zwt{t116%|J8=RHTX3_`EGY$x}5IZ25%)^XO(ApVADk|5HG_R9_7+!=WBJQ#P z06!>fYzxyjCJPsDWzxbBd1!S`ZZ8`U#1Y7$B_m>tJ|aTY(4~FKj#B#6cZ9@*fW+UF zKS;wbrIEy3)6SbGbI|~Tk*z$RE+HFiW{zd3dZsb$;bb>MAVmiIpK@`I5+W=yK#R!$ zefYsej#wpmF$&EHLsmGaV|EoIrDJw|2%}Xvk3qYjV|IZ<7TgxSNe7JuF=`j>pcOD^ zGOl0;t!_1`?qO2h+gjb*WB^QSlF?Y<+OR*n{X_JZnXdgtnSg`&V$k@LeP!g5nVLTR zT^^8%%@nu6Qs9eztYAK$P2%R50fqr=wj`INtxg%D2s1`6PnbQP;R)^~LgfOCKgOc` z4)1_Be=q#{$>_NcN6&)=@G5L^7@LK27tLEv@9OtJXWtF^lDkeRiA^$HiUe>uJ3o0frO^8XrIA6+s34dc_jgY06FU76t zyrd16c2GaazZ7GzdFdRU9>Z9PYKEj;q);EO&86%zD2rhp8%zpcoWEekE~&uyCsdrv z{~P%rI#F4QV?f3DW|w&+d>OC2Tws z@#55WrZomZMYt6(+33x!z>dkCdJ7}Qb3kr3aU|5iMNo9n!8UIUt70Tkd&ux?t~|4k zTZmm|;zFVum}xtQa)?K>DA?~cL_l%#k5mTOUQxy4RRKxPaybX;wAHh@B+f`blpqG{ z6~ft#B@u~g4dR*Y=jYhS!bF59PD69j`wBg0I2I2^pTqxR{!iw?dHjNFpWHt;SFKK( zaZxORu|$I!=bCOb?I*jNGyy*Lb@4z>L)zR)=r|4~G--RnUeUhQ!kV~Uk|2N*_-v|z zXQQR@SA4mJ)60_j7sqdTI*<;sq$p2S$zjtzud%B|I5zfWgqVcN{({B_5Dzy*c4=_K zg=2?J$(l9+e+g{W@Fn#0Mxj$(s9f@KYE|~OrxZl$jsoQ&NiuTdl%osF#(`L+c-X{v za*>&`cPlM(5vRxcalY(QA3Iid2Gy(64hgcb>WaMR)t(KG$VrBCa-a|N7pJ^;HqM(T z>!qA0tVhlx`-O8Z|KZrOL8%W1rXMX2a!rIWZUPgcZQ+oqY|yAr2>%@=613UHE(pD zJ=Qg&%+rcO(*c%@HnVG`lW}VJ4wgPhBFLkL*b}%CB6I;GLY9UhL~g!7Cb-NJA?%LR zPHB}`b8+^ZE+A^aLFK+RifyJgg|a`5=&@vt?XBdDOYQ%E{S;rRkS^EHxNkp$5<-O8 z&r=HOgu5I)P*~2@7?sgzl(s6MC18r(>9s$X|NBm0*g$(srsRes8~{1tUBJ$S=VxjRb;=TT2=)(Cscop0rjB2kNV^(8DGir(@2F@5}5$Z4! zWUNZUlIGgKvBf4_LfA(O;y1m|I zd-bWEDNV|{bWdUyM5a&2gGfc*NhpQBQDa1yn-wzbnjUCP2VMBU#S%xuQ<b$}?xcj#x$Vs2`X=1Rspq({^%Bp*#H68Yf#8wip*2Cj`Q5wO;UU=o zmpYpnZ$@g2O^ta-T}mh!xCOY8;V8lUEQY)2`BgjuOZNtGm(&9GLN|;yCA)Cgu`X~TX}C;cn`UQID(MJ9Cz4L|n=XbY zIBUGjw3#V$o8TtlhF$w z!kkADgBydIg$oy9;s0b**yzK;#RW0$eP;b5*M|U8EfmxkR}dTDtwi(y9QI!8)PjBg zlGykC()Ge+DqUrXj1dMeypvE@D4Vsni`ABPT5FY4I$4hk?R8v82HEqZqY%oH4$>L| z+00-=vbEcZxyQP0bkOsT0pkjQ5kn~|r9^xVumU^7a#pcZ0o%hP0>zj+32IfyOS^fv z&lp~CIaOlQO@vp&uwcOO8ArgrTO#4pa4^JqB0XTkxxaEakdNT2Vp4cSUg$`c!n zHB55B%k2U-1`3y&V(*7zKUmS9n1NP@*|@}qq8`JE8l=UI9W#WAQ=gSj4c|Z5g2gWd zR}b4bB)M?6hLxu2MYTGpR0_Q+)7d~Y&Vks-JGVr-okf6>5DS`IRcM_+t$Q;atX_E z={^g8Hgx{Ii|hYLmg9sC`??-g%(%L+aak(LmW7QIlj5<9=o3dBg4UK>eG)D_BO_s% zG>qhJ94_NO7!Hu0o*C1#%meB>iGaT)-+g07>j}@d_AqIQV`n3S0CW8ZFU976O) z(5%$YF$n`rqR!)%+MJ@?j{s+65+7Nx=HaVB9%xtKgVF&sD#59NZri1Xr$ZmP#C~_jZ$W~6D&oq#^Q*`nX$dLi{@2Ra38&+Ci;tv?M3APYXK;z>i72*8rSYN9yGJ%Q1 zD@7ci9|v$ylV|D%4p9Z(;{JiAy-F?*VBJ&5IlnVCZ`FXQM(2CHU1UBlo?mLi_1T@6 z%-CA{p#=rnI6AY0_^dx6a<2^`V!noemFPeH9opc(P0tX>LmX7O;)pS%uA*DP*VeFP>wJq(szC#CK$BhiL)>p-=2E?H*heCPRiBu z26QF8C~tTRskR{nHUDWxZpcxSFZ4$Gr6k)%jcx;U0+)NGIZ?Sg04ohki-1JDeXUvN zsV&pARXuxZp6 z6ht8n^%ojmD2Q;b;deYR-UnG+u*=2qrBdZx`}iKsgr$)SYV?V5pa3?BxkHl2OxJ$kce1F+#{In&K!5-lQ}Eg=xP>lV39j ziZY3WgdGsjd^D8SL5IlU3Y~Ryoj#Ei5=1i80tWOm-8h7OzO!wv*E2tsFfa_O-$x&h2jw3ELnI3BrlM`U{7$6C^;Y8+-i092bp8@vuo-E!Rf*IJNjy68M|6S&95x4FD~D& zW_+nsO_+!XnYlKfF&VCeAW1Ir^tBOGxwj@?g(j#^3(Ms_yct$6K(STJkm5!=eNTKA zs&n^m-^R4phg-AvmlRRs!O{0C@~66FI(BO|`L(z_yR`H`KI6EV{=L6EzrMJ#EDwvf z^pAN08D^K~d3QP6TfBR3WmTJl=SW^HSAW*O_m`IB$7*%`{;EQ+{k&)ix_)PIO+K&R zSzS?x^;J-nwXUx!KI;$e*@k{H9_OF$EG}swRHZ}nV6nQipn?>$L$hNz&hPB0T2|j* z$j-0al@pXK@zcuU0#=eRaed89YnqJzR8k^%uinOaSP4x#tGvts8>v~N6$%O!yzea> z-$i5;Je}&4(2E_mT8GROBGOTh#Y>(G1cAySIp%lA-IsRvNd*bV#&~>4SZ=QcnSw0w za2(_G%H}hqh(XANTr$Gw4n`N_SmCJVe8zn1ff>xOt5+$&qtr z=Be*Ax3DGAGaF;#&@ELy+Gt9!#yHmL@1T=WP4oQ=lpeB z3b$UDL4~w;BFsrblxX+tXqF0N+NA+h9Dp5`wfQo@egwxN+-ux4*Uef*4BG|hsZ=$; z>LmFmYDiKUAgA}F^#Ic{3Bvscf*sn`=GEkO+l2(ms$YxsbFZxf;0%-oufAC-P}FeuUz23Bg~{GkzF0z;fJHKpCXrftKp zts9Hr4rd%|93}*?2CINfrqMIf#Sda{?y#}9#k@GU#}hY>>RwACkTt}XZ)><8rm+vX zFDAb0)?GV0KY#!3{iWG;sAAV(al_@Khn--ON=b_n~%>kZhNGV(<4u=$>j?GPh{ZGQg|nMT6?kxbY>fvmyVHzbeR4qNd{y z_!x`nSWi=4CbLaJi*aqoVtJDw0mk|LqwwAO$am)_NdyGyih~hRSIxDNSs0F!BO`@* z&Isk+R~atqm!#-pw`i#{!ZQLs{so0<768>V)>vFE;l9)$am2xa{4ReD3`&t!9g7wF zFX;_y1W^IbfCt*MENVoeB1j&lR{9y#q8ZSiBck9uyHNh{RWNZB{(_+{MgNiqjp8PS-XKMi zsb9hH^iKVyR|oO(5BQQyeek8z>aR|#&`C^7U}aEfcs!3aSpWy{xuML&7n zow1od{S%$y)!Wcu$_rGmGD~snOO3H!AUcbotEa3 z$r$))N2d1$H1J z_!#GLL4y+10)bNw2KSjly?=w?=fMqvshtKdXJ>d^c00cfxyoDhO7ZBE(VwUS6@KEN zfIGQ3Bupd~fhdm1t9CU4nQ}@5R?`U0_UaM%Q09jURy&vbq4>N}c+B46 zBQcJ{!o~&<;eh-^#=IDLn)H3stdaO6%3~P3d46Pz!$W*W7L(p=bF*MgH%prwp;=Xu6>W2eS zHI9=gW>Ey zTs#L+`i@kT=N4?v1|YPtF#x0A5{!`f*~JJghvy4_o{nSw?c!_*i6eh98^7dXFPV;g z_(k>^efR~UU~pe>LU=%LK*Tud5V#}A_6ghefv8|()0d{$R}CU6c8~ps`4T>uaej|w zoPnOiImW+EN7VmziJGv-|F~~0&jxmKLUSG1MO=~7Z*CqC!~Qa+#ZUc&%wJj+h>6`S z#x~nWF0gntaL{4l>5B>W@kDX$1$-?XOMI5_k1df5 zgtU~{M5(Jthhb_IwwKIx6r4d`p1gCR-!P0LuXO)W_#9vQbvlxIh{iNZI6TIDqnHS} z1!lExvpWNu-5$_vH)-}|wpnKC>}{6TpS~@FG?jsk<6}Iaeeglra}0c`4;IuBflO9a z9DoM)hJ(?7c`=8^WwA|j19AcK!US0Z4VHtsJdLv!9hM9b4UJ%su$?dh9uM|<6ONkY zn%r<*l@9dm;imC=0H0L&sUM?MwJLJTBFi|eB9n>-w5cxj$mhBO=9ig2SV@0gJ>sW+ zIG_pQmn`MTzMaPeJK=54zw)v3k0s(`OAP9b41l1J?+}fggZo64XJEHrH*>lLQ%mE#dkIRi}7N2HXkmQpE;fC5vM^HQaVDC^#ZbnfDyk($Mqegm~4^#JE!4J8~_ zsSRwp)wgL>5e;k|AHx9%&?21RfQNDx4QgY|8_<_w$x}*!Z*+pKV z|F%DuK_K++7%Yc_I|d8qppIepnRM*6w==zZ|80{0)B+^vD?p4Y{y&$sOUT`nTWx0L zXhvQx{sdI|%lZ5G(vQzJ%@L1Mu#@cuhRw$tZNFR^`W5bFS)X&uG;D2sQNh@k2V#Sd zQ4S%qOvC>4cDhV=QK;`4UG~iy&CjVcPS$B%qvJf)uri=ieZ(#_;CL{$@TTOjP3=#W zFrgp~UMS~G)~m2f!aYCqk9-COG&4QnY$le zh8)1SW8r*s2|sb8-ryzY5i7HdB7{MON}gUV?@Mx350l)xJcvnF@TDJD=y zhe@6b>L)CK>8yk0y;lb+TOA0-Q>iW@B`^U)nG-$gKK5OGyM;xfGO%a(80R`?)%{Wg zn@+0k`z+UAl*Gr265CJX#v!?qr3XPNvUj{=b_Km-^*T*PJ!AF3JA=mReSGORR-a2f zZ2THZIAitgJ7lv{ub_dwhtcguY;1)O&`7f92_)T5YS@>#8XNoDrFVf!-?jFrZ-=Qt z4D2&ChymTE29fj}50z}^sX?&+;qgWS#TB^c7E$yz>W^+1`Ge7g6d8mrL|ck3l#497 zZ@o)gk5@gN5eV(An`W%AR~K%(``#epPrciZ+vcezP_&w}$e3ql8$5?E{kZL()I)At zM+t}9{v|!Y6vn5U@1dT&(W2WI12#So34AOKzyq9(xq}JB_CUHIi%sRd!UDcTz9C5O zCJT#0*dHT=bq&S{acYAwf-0F}1UAWH1WfuVN#Ou2F2UN^e`Maq7k6Y-tbOvHBhz39 zLF0X8+A$^!a$sb}kH5^{`Ur?}ace2jV5EFaZu+G1ibEPYRp18`(4dzCUg5GQe zUR3tt$eUsM0)CZD9-baI%|;~a%2<|gM2-i~{>Hdqws}E9bso@9S^D^*293(?oc_rB z$QD)jfHRBSAAC7fD`130mPLP#g7#0{N(kX%gjev)nQ6Vws`Ba&D872?3CC@dP1@o`~dZe(JT zIJ0(%T75l3aTpKD`Di&u^mDHaAo^Rc zJ|NZ5hjRQ1Om!F_@NQ5x5x8YUdYYH`g5|>I)Is_DC!0>jenLbDgc5QYnxZfkY2YS? zo7nfv0d2@|iQugpg{Qm(qv0#h%*KL&khqzfXT>Fq4bqy%Gg3TX-zH#_A2I|w1yv7`qfjQmz{Jch)e zQw_~>Jf%Z7HZY^85$FoDw^!e(?M)>~%El5wFBx_8pj4-5^IGuCLq3a(lh(otck zv~b5SNidqtg39DI0wgDm+?=R?H`S>mF}3KMQ*N5%LQ*5tkkG(zJhJ;wW=;a~WFV31 zJsaoayo%)Uw#T*Q^z@{ZmNXOQtXtp2)0s@Vo{--jmzy#t=>`v)jz$z?r7n3mJ%+PQ zJWq2qxauLFuvGRGc?VmYU5qAf3$C|odq{6Fjej#3Qv#NJFP_1f?BoaTfsBx!Sb+B% zxYQd*FmY=UQqDBHz(kT?@Zgi4m;z%&9xjT_o<=$^?kPEanVr@~e2c?Yr?YeRB++GD z$sjQgDlNB%aNj57Kv?7P3rfv*sI}U&E|8Rvqo0gk8~sAk_Tsjb$fw}D-8Gn7d22--*UsNzV8er;c zz}XE1hx(-?m(rhHX5$ebYB7Q}fCpD&X#RnpJLDn87twF<5o$nlBrKHHM@l>pO{nyw z34)Bc5=lijUPsIJ{6_#IBAx>0iw&oX#U!Oy1uKk=p{wv1N&veT(9$n9)E(EB;Y%g` z654p}fSO0BT@jd2HG$s|?hTy-CK3FjCRQ1V3XtiL?TBQ2rGQtZ@P)2K=+yg#cy0uV z194`9eM}#*f`##DWpuhwDNKu2cAG#cRsYGy9;%jK$!?8`OLd7tB8ST!rJ zSSF@D>6JcwOio}2j$vh^b;i(nfP&5rVwl#AI0{quO`Rh+-j8!5Bo`SyKXCELmw?B# zm*M*g!}pa8->0k9+(C(S_@?nCI~@vNj(&{`u6RXTB#MKm{A@k^|JZvI z_PDAmU09HzWq7E74T3Nzr$w-3LMb)Nb{ek7fP=9e+a!TDP0LcrD99>B1I9_`_Fwr&>B*Bk_IGpW<&h|}gh3J9Nl2`skH^W3;i zpXYyCLvO9dx3kpVF6bPnSKK+Uy}WZUb}Dz?RTH{Vki5pjEw>Wq60--t5@(SUtOOWu zwNGd|8X|??)o&HH{;0I|mAG}%xqT=U-AW71*csxO4)^gokz0?%dwv41SMbKNq!%7u zo)+X0Q^_MgF4KG2#S6HM(SliAJ;Lc*vy(O3_yd*+{)@aO{tq5X>;UJ4J5`2HWiw6b z%c7O_@X+Jk(_Q3X!HtV4Z>hbk-Ew(}wvZ~Ja zq&Y-VMTkL!EGd2!;F;V0`29=u`s!wVZ4f4rZU$c&oo3eQWW9C49ERxf4tkAV!xYyG{^ouHHr9gms*ZrxYcX6~;x zW*objLSNo9rQ8pbVbks3Pqp@^Iyt5goQz2C{F}I0;H;QZ*KhtwO4+~Sh8B_2-~kN2 z2zLiNq(!&_gO@OMCt+K^qx1KL`HNY*ZKlAKxN==f+`O$gV82cF{Vx?!uHVpXem7g# zIk2JN5q|;B*|J_E`)=>aW(FtP9sGY8jy1S(0^qg5YW9e(_zDh5Gye-&yUQ4GZX{Wo zPM~otw6)Skj13z<}SkylW2$C!l^|#aGfE zorGJ*I=H;cm6(?vGA!u2KY8yaPrlJZUn*qz5*473@!`Yu2d~%QCzA3@ zyy6hTd|h5EudA5l44Q2V8{)6Xnfs_#e=t{nS$GhVCES?5gKzR1ftb3GD0hEuiLIZm zF^*z${7JcR0iH626FG;AF_Hfbz7k1%*RLJ%>3fh{=f6OKh8_(%lbrep-j1RDE6C=?eA>Ir{?dR9Or zbcurZUuUmkDT#-aNNjqwUtgW0q>fBCbtsa;24Qyb)V}s&8DOs>$4zYr)jURTKw3bV z0HEJ;UY1j6py(0L)Th!wj!wTR1?AzxGFblVVA+a6`3ExKNhO&Wzu-co@%DkqQ&$@~ z$gs5FFqADIdyi2Wzkd9s|m}LP8djce}ydPlj#f=8Jzj16 zJ52?BxKfy~f$J-9Ns546yYO1Lhr9iPJhNjbiv>4|oxVP~%bwf%2*NuXSCnQ0PoW0A zh2e1&#GWvB4kG|Vi|d;!aN`}RIKVj_#FjrIoP@+$-b3&tiHUB;yND;3jL*9LwjTRU zV&n;4E-gA0QmNp+7rtdo6NeI_`8lVojD9O4DB*@%SsLk^=%CLXiFcWQwfNB27ZB-O z!z#oc;pysZePd^LPn^;VdIV0-M9s8Ilz#2>%lC1qK)5Y~b7mYveADASbwEe=hU?Q1 z1`azQbadzDfrDE)cx^}Um`?V9j&-w@rz;xGKwq-F1Oi1KD*%?X;dar>`?0Wuvz|Loeg}bs3i%UTDtfh31T0Xuft=#g}W`e1pr(8}2fr zr#a&z8o}1w!v&tBful?vKtcp&R1Qt-1Dp>tgipsMI!0IV#EC*nn7bv)C*kNF6BXC6ri|3ntbJ_cD3=GbkhlC@o;azLoNCQ zVe8OE+-~E-r(_c9kww7f~LLrbejd-2T~!rS9~8=9jwH_*vmn<3b1!sxGy-<{P!tn55vkC1;H! zJka}>?9xrWf4%+lR62AWV*XtD{`Nyym!>7C%9ntCl z!tXkRi>tmsUHE4VR`ytWh{Vv}WEZIpz&LX;+ofO~5u894R)Z2CPH&)U&sT=3;qoz9 z;^*D&d}nx7OE#S9cH>Fe+JmOg4%=W6F?Yrha4zV}zi=KUjt>E>own==|*xEa1S zfBMwinHpcfJ%my_Q+xgE`8Ve0=HHw@U3-f+8Ql9iGYGWyCW5TJAz5NigzR5lug#$Z zE`xYSG7Ou3Kn+)#xlwytZ-#H1n<1^p?G|vl>}L3y5rKdMgTf+>gVBz?8ER*=(~?C@ zI3hqj~M6h*fMhjNi3A5ES;DZ#);FOj)r4*xZebfw4-4us6y8c8+g}K zg_)>vZq@}vHXEqRLx@1p5xF{|%BJo-gsFfaXT`a zqP)8R5Qx=n1d5DsHE0QYS`Ddi?`lwCJyptW>U)L37T&1U9?aFCX|I;SRslY3`j3T8 zgJ)XObU$p`-2gd&2x7ul*s_YsOB$y@E^J>wcX!4%c}Kyl;B~|R6#0o^TIm4TMA%0% z2E`P%;CF7bAd)3=I+GOv1MT8MV1Axgtv9RmGvwG+qIxO$0D5>8?q^4#UEFVYAd0~n zG-0BB*5Re;K+T#E_4T~eDcFV&!q_fhnM+?|-)(UQ7^5sRmPi(5nBKT(P&86>(a=lU z^G*2qCXDkU-6@}M!ern---LP7Jk$jWO3u$W;nAD0c^dm&m`wBbTL`P+MTAz0yNbBi zP-JJkcf_DCdGpE5%6YecT`m!Fmy*jDMbRzBb`|MY&iTq&_PAE4TRtRW$i7=dY6}EWWRfz z?kCtNe2p_mw|?L$$e7&_tG}mr<@fZBD6zP#SmO5+6=1p{uDY&SV@oLQNAilbLOp3D0 zI3LGs)9v4k?_X{&XZKg3nqjpwRIi#*9vQEGXCJE7gRQ)xhVV|nRq~W{KxWC<2?t0B znJ_W)m$g@~&b=DYj&esFmEJ9)($!KbedMV$d^04C{%=vEcyr*TQbPU6#H~Ku00Q7i z(2D*gY@S!=pa{eFB-lK7&w_^Wh!q-sgWQ_0h0F8S{28H8G_?$WDrahMk-{bGZK2^a zwYRU=-W0M02cJ}~OdrG&5~dGm_#LI;cZ7ydiF6qqFW1hL5%6gt;5n9*A=KWT6!k(Q zKY4!~m2OWEwHlrLi!c(mk$>AZ+9txV!c65y2^!7cxI*mUsLP;8MRokGex87twFM?B zwP#o&pyWmdJZfhD09x?LxII9~&icw;{m}pc!tFS{2)%_VokI3N(f- z`=Fi}EE=vElY|UL5i6S;e}|SMoS^K&jtMd0jnWeh%M74Dtf(H8DT70pk>nSjtbE_E zGZL~%xFjlf=lXwR{PIh?Xf{K@68Kkm|JT_P48Jf81Sn5lW7N1hho)9{1}FrMFFZ$N zXQ8Wx`4W{g6T2Cv(GS z?JQ<{n3`QG*CAXz%rAC7dPxw0aeG(cuu3BKW`lL9o;}&eU?26Vq{r1-%cBR;f)j=5 z!5>DpX3XRN!1&vUIzM|EKi~#x_Lq{>Ju@?Vj zRs;`xGeSQnEQ1&bcosz|Xr~>uqf)@A4BBZ&?Wq5>unfHpbfR`>`rnD*fpI#Gz5|%M zfTtV5gXoA*@r%l!9mIzTYoVQP)J_lW^rChc!L1jy(?dJGsGT0#=|$}K1^R85XMmW^D>HHGRY|>;q+XX)gno`%_`RflnxuXvsW+3< zKS=85N$M?0g_2*??rllElceGn19<fa^xA4%%}Na{b6 z)c-4~|C^+uRXmx{H2>xEa1qtKc0Lb0ea-9U^T0IMJgAdKXvq!H3t z@@#)Fn9Jqa{@^J%&BH5N`-3KHF3RBj;0Gy}XZwRc z@LZnl4_dgnJlh{UBd2+IRA_$?XXNs1e~`Q6@@#)#MC9^pe~>Asd9+KE^;^#Ow`}{v z!zfqJ_6J+dT%PR@exQ;(1i8}wa7)PNnf}NG$<;Ic;dYYGGyUNfmCLjA2Od#A&-Rz6 zKU`o8oO${KTgc|+`?K^1ed%0(mi}-VrAXZGrZs`yAo?M=#KQe~XdY1lh7s}_^ z{_^xEoOj{`?nk+Lmj0+op7uu_a;cZ6Kln_tdHM0-Rc-3!`?K_i8&$49^~w)8^Yn*M z&!){h{XtvS=H>gd^ha@GIzIY0mGR~251QgOFF(GX?JrM%ZA*W+q2>Cs^hd@-3d^$X zFHe7n>u6xf(cjDq9KZ`N#I3z3sXs|le=4azOHv_DMGOCyq|Qp}sU-E`mL$KNCa+8K zD@k%qQh$-8zACA&C8?(+^-Plbx}?65q=L%=h~G?7-;&f{CaG^r>N`p5yOR1|k~%M` zze-XwNrjO^d=FTV0UrXu-N$OciJ(r{|O6vI}^+QShO_KVNq}G$vB}x5lk_xY~ zn4V^m3NLR+Z6~R)n?`CkNrjO#QkRp|3zB*a`^Gx}@GnQhzV0pC+lFN$Slc^$(Kzd6IfdQol%2Z%gW(B=xSO{xM0tC#m<7 z)CZFKWs>?QN&Rz@`WH$4DoOoXQvWkarPo1B+BZou>|l`kZIb%mlDd+lK9bbcBy~+v z`$?+O_v0k>J1GlGt%x%IDyiQmshg7eBuUlnWRRq8OWD6AsXLOoo22eZ>VA^?gQPx9 zQh$`xXG!YcCG{Uk>i|B#0*PsT7DG z%P;)9@L(jlX}bY+BUv~~WY)$EBp56U^GMjhYx~FEujEdPfL4)!P29R$4h_Rf3l6FyR>Lsc>>=*1GqMMvc1{=@lwV-u+`Rg z`+JhX@=5iLt+oD-W%a>Y?eA>SMKnvnanowQzqSjf@t=cl`($I!Hum&8ScWgL+YNAQ zA1|%LHhkg6*6Kj~uYsFN_fBAzfu*}biH)%+mudp7RLjVulx&XkQuYDof_dB21OlCV8|pnx4QYp^ORNC9v{ zS!RW9Wo&g@7VKiO5N-J{z%v}I(IHJxR=csBPly5cHdeEz8++dg8&#xvd;2?JG6Ou} zrLX?@QFiCiU%@{8&u@f7`BCmBpaBHO>tv~~ zWB_bKSl0k={|Q*~yCFy^_*fl`)<7?VJ|MXFW!a>|z3(=51;Vl+pfhBR1lMAWg>?fs z_hfqoYXfF?0xgq(ioiZwYJ+V1flQ)pfHusQ48Ppk-QV6G?7(+mK#1a)O4ob~{B2oF zeugb*@{%fu0*tUFqcvKk8Np50h(k;g5P0PZ_%442jVT^Fz%5i;gC%OEZw^+7 zR;khfru*jJ26l~19OGe%GIbLX4$TZJq?WKHM$0R@$=@K~VI(vjg`501e9ik3o-+;fd$-{`MZF1HXk!t9@?N8#@+W$d!PAgDuQA zySlcrb#9M@#cx)2t7R(?M0nNMc#Qc0T)_lsDoHb$tFS7>_uPli_*Qcz@SEQ#5NYjY6cE^Yc+BS6F zK&4!4@tcOe-KHiaXX_hU)>50#J`z6;#6S4|qPGVumxoclkojGIM~+e3Umr_{t)Kff z4lVR`4SiF$fEkPDb^Be}dWOvkiCP~gHiy5x!{ZNb-Hf0O*hnmR3a@BDWt_gxtO*9? zT#~tz-Q2}yj)UUqcaXn58|(vP_n=GBU;97ko9A2%&=TPiWIZxm_H^=;qHSj))HJ;l z3oV5#4S1*U7^QTx&v~N%7htN#FFgeb{{XbPM7x)zt^QNg*Cpd}kZ2*%gP&1ozQW@M z%3v1%8^z9vJ4i(jyD)2TJJ(;e=j8*;ptJ-MQaEsQVnkX>JiD3^V3TtP!cKqP9qDkN zxjWe3S?%i?u4ka$R*+;*P1FG0Y@w99c;H-I+Smm(%O-$ccKZMVE^y3w$(AgFEjkNo9FRkm<4CEr@(? ztZx9J9jvmw1F$}7tbUKdp!^+f`OmUVCc~R09R3vy(pQ9|+_VysHlFN1DeC6Q3h#|k z7f6ar)6&dA|200cBG6H730u5&|AlJyEnz52R#zvL|yC5Q@z?VIwl z>7a?Iyxoa#-@-lD&8Dd$XJA^z#nLcGq^rcG!hZX>j~bSCc@12=Yd20NFqeoVs?KwdUDn5aGS zfvYB)TD6K&G^o1S->X*9-Sd67ScNCmDvMGBRBPNz)HkxeRj~=X#rmpz?gF3soGkp- z=k6MIDos)<$3w*x!rM!pEpZvaLTLMOC*9wY+TsP2Np1s%svvKdyi)SjwToxfDhZ99 zU{3cow)Xo=gZ(|0Lb6RNs-M=v?SajPwQ!5k^KO3^eR4cjoB^*tf;;&qm#z5#o zdG2*%0>WgAped|za1gqsc1Ws~;n-=x)=II$OpNPgWgP>^^@T7zOy@oQ33glGk+1$} zXJr*f*kJ8h(A&9xoXbIJi(nDat5(xqZH`8~$^L0OwODBLwWiJr7M&MXJ3KcjOvgo! z&h7+Xk^v^w?Dz_5?e?E+;70d^$GGj~cXm(?B}^}-z!ED(<#qbf;sA>5p(PzYe47V# zgm0wPmNIz{`1@L1Z*{N<)iD02xca3_!|S8p@~%hp4NK4~dwYDC*trSezRYyL&fjC- zv(G_W{2Lx~mP=)y8@`$@vZs858g7|2Cpcr%syel~2JC_lsjrxss~MoQsT`mscLZ0% z-4JEp!bQ<+A09+mG_X8&xqaCgxn$6u$@zh;4fc7MYbUt&udm>djoO+{77-J4|Kikg zvoUZM0H6%IwL#Fm^7a(*)&_Oie1j1>I>J^E)LOK(s;Ro>LOOA|-}!RdG_I+88=|@? z&BYbD%ZJpRtDVv-7!|tU=v7E701=a+qcRYMy9kS~?(J|Bx65EL1X&6x`r6x(ecqt7 z;wE{0K{bb&Os83Z9vSA+!h&JH3T)DZ?fC#L;6@R_paV6jVTW-++mpLzY;NpILs|v= zCAsX5Ey+7Q{dz?g8hDI#iS!pQ!|VH&hy<;w1&x95Of){mJcXDu&=5%p|jQ**SN& z<9N=w>u{fpD}hri=Wl;gc|JiMjtX~NUS;gm@DnVnXNVZ#VbM{Tk`@@d*A&*!4KS%; z*Wc9$K(Tv6G+L~yOanF|d8!$Rz*y?<{DAk5z=#VRu50uxlb#;)R?hKqJ$v0byohwN*PW96|l82`nE~R(`V%r5IU@K)>2X6!16sc#<`<*aY zwzB;#Dvj$aM~m?x7B>+Q!ro5FeF+%~mLI+@h%}qhPjD(pzL|w!<3@YDZ%Ho12)LB8 z<8w$pCk!*(qqB38dybdwbEeEW-@Q^Y2n`%Fq&of!9#(4uOoZNb!NuFPJTyuwv@plK zf=f3+NZMiYvnPXn%%r{ORcg*OLzw{H3A^CPk*YP-?;vD2g+-J(h>OM#8|-qQwgP5| zM$CnyKpWvTKX?ziY!9b!w@hKYPjiEHRf=2mBXcEO03rU@Vn-*-#>^>vJm zYjTY;NeE!kqlzDV7U6`!%FfD?uxHQ;cJC)oR#3}vXC#4WL41`UtK7=*_`7lKi!1dO zY<*NfgVgkDBHYB0O$$pMG_e7Q#a`x7|GO2S+YaKc?hL>gdj#jkm<{`k6gv~h5sWB- zu+nM->ySwny)G?&{PFn=yEfUB^yD2fa~D58ZyC`z%a*>wY@sbVbpB)og`iPMcia{; zyN+*c#2A=ub3A@wc2|kLVT&mzDBz2jW>C!>2pfG4i{0r0`DFW`H9PN;KCI=wc+>Dw zZBj%@HW57--aR___FJ3$?YCyP;k*R={fHQMcej=xFTrKZGv}{(b~w1fWK)pagI3&y z!0`vcAj2_W_!#!Iz2~@QraFbQ5IEYymz#r`9;ONHSXuR5TL=?HG>k;lc7nLpXuwX+ zA3%62iPh;LJ+p}CeYyz(4d_OI>UZs|XK)vs+jUFmt8A$>IXHcuz6I z;#Z6aDmifo71VsX15EZ+sqqn^5T_OZV{!t73hJ-nP8c?z-$iXiP#cjj<#E1qeubiO z?K`Sx-YRCGDlj?6#B&7E4N!zH_B=-eL~Td z_3WlJM2zy%L)$#3&91J6C?ZBP7LYFlT=oj$fwD=yP6Sz6jfaUjKztiAFz`w|0R$7W zl_4j=d$}g96Y*iGmdu}L*JH*7)qINJwH>W*1Xwk!5h7jEhOTDPl86ZHe4xSK``N;! zcuVLBjDB2;<%}ZlA+ISAiXm|%;wZy}sl1!`_M6}E`UyAamgi+*;0@leHylCVkJ=ym3MZtOy>Q4R%>x0{aqFK3T!=w(9ZrqtddagcKrkbGtniyyt)wEa8~W1zhzQ8}vEAds*B6fu0oWY+3dj5y zm)sm+ZjLPsSi2O48|GM-=MD7C&>*+_$GF$51rT6pwA)2zqkA!p=9(>cl0d0X>$V&g zJ$M=-pXTcNmJJXXvjKHD6)ooGR9k4e_WgwFs<;Z7>5D|<4mAs%z5QTtz5zEeenm_h zzzMq|drt=eLL@VW&P9vVwP|LUQ~@yJy7D~G4w7bwyXNW`s;~K>$)!=RHCuL^;UT%Q z2Ab-xKpuwynmqz(Kqrgt91k#A%9uTdi)aCXViI%{a&2gG*o;vpDQyT^E*tC5at z*bw&BA@G=HcvMoM#gED~WHa3O!oe6;8Lz`w2;nhU?pc_`jc{e3qWrCOUgwMiosVfK z4T)qLsoXDBL!ltFF$AF?9IFpu^h!+B!=k!;$SOclMW3AO%|>*Jdx8W%QB<(87EQ1A zLE^$UIZmTS;1Skjz7#8W6KD zw>Cs&*{I{};sM>q8DpxEG~5G60O5rZcP4B|_V9H1o`F*h=NnIcxD-bu?=Hn|Bs!!85; zIdB8nh9+Tb;ExGDI4&V_N!$1L2HQ7*FCwo1g$W`fFG`0>+B17G2N`WW#*n#v<3hXh zXaj6AEO>lPRF%-x&4J;^oaO$$rz#F=FU}@ri?Pc|N(#?Kcx{ML*;4gl} z)mI>z-gvaX*Vpn!1;po-+t)t3b8qP-cvfKnUj8>WKQb2}`N;c8LH+H)F5RT?4_+zX4PXMW z0Pk;&?!V2QTG`!LtsC1GzAm=2g#{ofT=1A9uiY~4 zP96BJ?*k2hk>oC9e*z8T00x_hWB|@FnZ01I-oA7Fh6)3IUsFY*E^S+xhxkaic?q#7pF-kldbbtoBg`S{i~8(xFJ^ z36SbQuRKO*Wh3Py7lvv#Bfi(u%U-B@vqkrge8^6Jvu) zAD_p9+ET#+jRs_DcrbXdNeyAUAvt_RYBnl@vSNmnZ0F%4)|8>iphP_u>trT-1DB#T z9w!iGkS~SxGk_(tgk^qUCOLB>kp<_G1btX-1NKQXvD8g*2j^`;{aG*{^1U<D?1IXa9o0lwhq z2p{4YyTjiwdHdDOsaXV@7B`3ZhA$+P01+}6wX~u+Yz3an7p!A->GB8ia@^Wx4IxlV z4#W{|>Iy055ZWlzj1*>`lhBzrG;UE!MRh-wo>2tXO2N*#+`AyVQ|wy_9(QOzul|*+ zy(1IhW(UK^sKZ1VAV*{qnb5k83Fypo0$5R!kleOq;KE&9k6~N%BjXwfD1&Xtv0wm! zH|;YV8MsHoDz0DO*n(1TzmCg3sfYDs?vxDz)2=$AvWpRx9K+edRqE|rx&HvzfZc|V zEnE_8wYogM;Q!OKzEf9^VL$>25%Tmq7=G2Uv48=FQa|b*>*fWcLM$z;BmT{v{ka(r z3$irUVt4-$;(Z!e7qx{&m59e6EMg%SIiN*GBEe7a|D?wZj?Pd|hgbKN;IH&NT%Z{g z@adF5=!woNs}h^dU0@C0GQ6ho?E5BL{wA7Y_7_cgJUMcONW86aZgnm(b2?0%j=-MJ zPJKcocnGIHJdZG6V%{k<^jR`rMPmdJ9BhbL(?kI|EIJdvmj!d*vY0DLz}!X|=KA4- z1+WhDRIz6BQ-LNKdr*mqlYoES4~mB`EhxqS_3hHRA7+-DA0Gl+Fg3kzd`rBoV6EcS z<^DG@)F%YQ{P&yh=TTWMQ*t*QiOH=oV=}w;t9M+8Jam8vWuwt-CXUAh>-f=Frua}; zjEM=c7_ZJLV=*Bp#bRbw+>hI1#$tAT{8&76fQXYYB`hXb$B)G_#fQRTOiYNyd|6L@ zHx?L5FI_vn<q;Y_WJ4FbBa5xy zoJh0Yl7Mf30ltrAhsihQ)O~|%;wyDN0+KXkaxIUb+4;;DW@8A2P*NGrnzeGzRbEai zWA;lb)5EdUZZ&P~Rx7Oym*|GA2R>H__nxincpI&5TDezN8LT7tLDbHdZRhPqQor5w z_1lPStxIb7Ooa<53l|a-SAI2Hc>n&QB{+ztgdes5M)1Z~^T3Q2RL3h0t=Iiya3SbIzS;Rr#%kvJX4VAb)pr z0PU7Vvb-2;m!H^%g{fF?;uj}GesG|Yz~L}M;K8=+`;uCVx@5d$gn3xH&3&*h$prQ_ zgqRVMFWwcYo?llTd<4(!_Z{5zZC&CtRj0;|4qF7DBJPuryAO`XeGuSMW*`)qq$O_B z!g*!0b`v4joTM$h!5YwCIm&|m%md|GQ5CBx>(-CkL%^s_P+l9X7Vrs2A_`!Sq;kT= zb8sI>wpGLq#f>IE11fqpG6i!w8t$kt)$I^`_YiWQxmX zNaj%GM|pOtP7@9X@hXupj3Flos9O-Dlw2k3MIhvq>2#BDpy_=7a3YYI#1Cn?3b~^IRcJA7MvrwlVgvv6K9Zqjw7$sP5IR=#;2sVAjwy zvUJ3}ZeN{wS@y|S1k-*6Jkh(VU=p&LtuViC^V>e3 zHw^By+QNUtC79Q2Sxj3OOnaS}20_k89?+=#hXy+<^q3$!AYgdQeGI(d5PfbR9bY(%_JRYwxLYb z%kK4|+J~#`qus$K^qaCr`!qIm2Nu;fsCULascc(7-z?%52(yb2>~0CK^mZ2GdC9@{q-L zhZS)=011`X6XCKDi7g|qb;~@k&pXi}D4y2fF;XXG6LCaNSXpO+9&|=1PF#WN0=yr< zuf)E%FMwhJ@OSaaU>9#3+8C(s139vwQW0N1efwmyspg7Ho3hqL0tZ>c6@}?R&Ak3a zkXfdL;ffreCWh-`oaz`sqkM5iTXT>%de~FZ&PX6U4o!8XSK}E$cud(5? zxT%8JrlYnIgHa?^iAxk6!LCF?1!L6Wa9!9-4BH-!_A2fK{ zlNYsk;0fR)Nr3%P+)_=s&BMt_27kW7(M8zXobWRGD!-M1voqfcuf&M1ZCQt02)w0hEsu-8NMlk(gV%ZF=~&bb2dpz zs50=WXq2RrGD&LCNjbua;I&MGVd#VZBoKr`GJ+z?`4etT$JNpf>8gYi;rD$$0gkM&;+qy^ z4+ZT*v{qa#UdRrmy3$eAm9D6+IJOj6OirW3CJJxK@|0|1$c%Dat%&=C4~=S$HkX6y z)KY1|@TKL@4I-iF z8|`l(bucWr6>u+KzIx`o^6lE_xQ%`~)_8*nou=^MsJOvd&?F?c?0}uBQWdQkx2h^b zE9cu8928a=|MOg_ruDC&RFkYP77iBDM)8hnYO!XGD-HFNGW8l)Mj1rIuf|!E8ZA!I z#@DUFYCu&yKa3`fuUh4e#$GA$&sDB=tz~sN)bjPKT>(lJa@;U7tCizZxHzi1GilWv zE5Q=#RuFRfIUdeJB^{TY*VGBJboSU?kSMAdaT?b+P9eg?DWY@4Bp96S97P_$`Wk#l zH6?Na0pEca2)MK<3j`84cz3VJt_o`A1p+~48E4!TNpAaNG|hBfj8h;GG@26#1bL%} zJr#jK0^xDo^IaE0aPI4%0)e1nDiH8lB7zF~p z&HRJc=arq(uEfGr1Ol#mnUG1604Jn6`^Up+-nm{N;Inwtod60T7{e)`?B3;ul2E`H z1p=;%F$x5Ho5Ltz^q{9A5b(egz)4a7`#S;!c!7W)g5Jqb01YT0!>OSB0pSLe(7_l5 z0zJCr7>41FpB0T2H%3Itpy$wR?(Deq9y#z<>b*N|`_Ay4%J0iQKR zfj|g^zOF3~4MaL2|etK0*aB)tqK)}OUC=hVjd4WKXrLz}t@dG1XUyy5@lrjPVU&adr z=v#7>M8JAg-07414^WRSRSRL2fBm z+?7eL`s0)axIV@z4hUM!%L9VU3PYccL?D6jSl+*`52Zr)d0?SHP%|eL@Oje}3&d~~ zzJB8(g$I`_l2F7rB?GRHaf$|fqXlnYpIIs#a7Csh9dP|0pLoD^k&?p!1q7}g`|u4U z1U`?4-}JaaF&rbPq4X~1T1lv3oKgbU$2i3VzR{u7P+{QHkra6N3F2fA2ljXX=BNji zQw=syAT98DdSgEc^q`Q8pok$43^%5PCdMf-aD9wdWZ;_}N)?p`KOL!oAAtfnS<28p zk3t)Pe++2z%5FH?aO!F2;}#EGDesTmdo)3hDfR*pxI;HO#8zN#d_RXemOfk8T; zXCH_BU_wW<<>3`X19?aiemfT#VIU8Q4J2G94^SbpAW@=gWa{|{+qm&m1y0gly$)k- zbkUoof1}>NvFqh4mwyRcfrci%hNNcm%4L`Vz!8U(qQ9+X`^x2aX5WRUEI6k5gSbqB z3l3(t;qhesit}XD`gfM@&VF(Qu8SJ&EBu20p=OhAjx>|Phz6Z5xnM5Y46F)hoFLW^ zaM9W7yux~?U~zDE_BW_We<+M*Abd1FWaRp$F1QfyZC8D7>A){Zp+$P!;)LC}ckj-< z^VucVa*2C`@B3TzNBzghU{jJoM}k^e3QNW%L(}rcS_yobctVP2jB|p2xW2-g zrrAKqbAV<8yY$!Ko@#4xeJi_mtN!QD?%cYOokg>M+aJL5&RL8-TYT`<-5cSgE;7^? zCpnnUTQ_c>UpRQ=6NIt4kj3D<^b&zNSkD^S451DYQt({Sj6ptGfig}3ZyU>}t}7uJ z+IT|}Uq<4)z|N*phxiCUt+%O5)#S7p!-$_QhtSRS;gOt9D#HvE#x~fu9CN9zxfr*iM@G; zTm)kD6NhDz{@kkUU(!``y82w+A!cR1_%JcDyK@bZBfBy=L9)v!mn6F);7iA%WS1k1 z!x7y4oNH%4Ji}ud)c_pR#`a}l3l(34HOS=Lj2QS-Y}OJGCrb{Tl0#QvyIvG6s5X zVkS!*Ix$C~4NRH|RT>QC`;E1e@$MEtMo@;7IS^qi9}8g!9FwJsDnlprPm?SJ#>rBJ zbXnaNIzW7Lr^1xwiDHUsOaX-371fw7j6Ifb1cb+P$Uu+oAT?-PUe{KQ=>i-kLZ_oF zuCK3lLe!W7fC}&4NIWhzCJO$ke?cVktRw_S8v_9_IXvMrc2t+C8hR60|{y%B52awoNm*2)t#cwD(F6`r_79i=hdJB z6e>}J3QB|;Ri;&=45h6@BPuhBa;j{?3$I`x6r~`NjWv_1D@vJ#Dp8cm?%um|_kQ;I z&Fl9Mr!%#Dv5L-Abs&n>r-FIJc6L1KQy{H2No)QLehGcfzdk$vM(qvK47vD;;b;c||Pf4lcg`>uf1&b}sZ< zg+bq@9Sq(@hhsQC^?Z%LP7jQU*p>4k-jR_{q+%FwC~gyqT=_(nN=s6aE1w8Ou3RGH z+P7lW&tuQKppipk&&QMYu+_1#>)RT`7*pDAr?KlhWt0A}we0G5Z5YaS zFRdReV#lhQ12nR!u`h?fc*iW}FK189)7gBNfh(~GSnIouONu(MnR0WkQNua0? z6}amTs_OSCB+Z z8IO;UY*7Y^JD^+z&&wXBO{=oMIn1cr9^`Fot#0lkTsKc}r}Y`+TSwwf$twW9T*)ga z6ze$Uy@~jub(!g;yslo7Xc+uys?!Dw+9U#}<%~91P)cTq#q!!>U(UQNVX;p?Tz{8|@9|J#nfC4ZUx;#iv!x2jpU%{N zf%MMDsMe7WRKJYGS5#$LW6OT37e*ZJ)T>8JdPk&|Jxo^?5LUU_`0!=1aAAz_&K!ek zqYFKXWiSrWj-0T}I+DtY1g8mkNo4Q6o4q266^F^*0Ru~vz!mxk9 z^1RsTaVU9$GRyM_pWSTY(SZ(rKT|t%dG5446;97SP&}xek(Hm5rEkuBh*0aeOt#RA zjkmpl*!63S_auwIvb(WbAFQu~kq1TEHN;u>+h7rP{Jjs#&K4Fj*@UoP($`NLFV25F z#0rcFBXn+wstf;=qo52SvD6Hi9t#FK44B=uQJHH#D)VU08%d)LBd{%51ia2Z zn3;XJb@en&08A-kRM7E81s7&!eP|h43aH&iV06)JiLsp6%jgZ1i;WewWjcl)t6X37 zH=o?oGI(J1~4il2T*Q}>gKguqwF#r&!Esk zEQ}tberwQ)QL7w_f@{=lPQx|Itup+n=(y&fJPyG^(1~n*!M9nD%4)7r)l|Rp=yn~HNvLCtx~@SdV^nqxTg~hDg}G&Kv!Kj$yf6g-9Ge@appP7B z98BdkXh{w!?51AlHO%B|;6zXc0U1RZWpD3bKnZ1xQSUYAWQ^{Z!d8bu7|~8hNzWe+@I0Q*$C{LqQou9p$X0U|0!#j8O+R=wz&}nZkC5Q%JQ5 zn2H{3I0yxE(o~|o9*Iu8E^IU$w}uUmpp|Mez1X0qy0ULi z1hptAqliUI9qd6eM%~!_+)bKPs!hOD^kegrGwEYRC+A3X;&o)h;RyTsM39LI_KfAcKVMIZsUYdkOgKG{n&B` zqn?Y$Lp>IlNz;z)chn?g7pF`)7SKu4jqUeHRD;PYpqkxhPaX|6PYBgmU`A1mEjJ2b z61ijJc*w>=GikE1{f?Ri`1zbN-B?H`O*gjRBhd|KuYhpC%vgB>Ddax%K2F5bCIn~{ z0fl8pp-)0Y$0WTEA(}KHg?*2jjjY+6GBJhFPMV;?zK=#!n8gC3`e6m3(N>;7MeRh8 zlm}-NLHUxS5GWz1V-oj!cqUCuzUNUh0kf(plahyZ(uCxDJ{lPnD*~(zws!YU2n`un zMiG!HHVS7F>NzHr00YdVNvGl*WK9UUCvK-6KD7;?lO`IwEJxBQD^?KL>p$79Z|y&M z1c#_6;^+wh8bv!{*#i>LG3gA15KWqj!oEk%2CNsSOiCfNlcuMz@9I7v!i~Tv-EbBQ zZgW#~0}%pQ)el6oJ9bA9F&Lf_pagJqPY_|_q99;x@|xY@z952%C&U><2vOnoi^NHK zgP5z$(H;ceAm%Q^#=v=lm@`)A%q{l@;c|^P2(;m>&hy?N8t^<(%^L(Sjcff?aO=QG zH@_0M5cjX$yLtCPWxo)<#Y?`)yn%XQv19iXQPgV{ml3|68&lqQM2K-E&LhGik@pDe zH=^ioLt+6jhup^Fa42DyxXh!(pRU}iU%zqf*8S}FU*6VVhjT4)p^|Hf!+=xlWFnkz zY?a6CW#VF>Uy8~2ExyG}@$BvR`RqX2|*dT^DI|)juRpe;41f7ly zthVFOj|GT4OZT^9hM8HGU)g0A4h8I6ceYC#)S z6?xGFmG%l+sHoxx`Zd~N7sMbb7Ggjn1vKa>d zF_GUDwC3_Ew8ao;%Iz&^s5+Y*tpq%-f~JDp3Q)n54=$x} zvI!nCcZR@=fH(VhesBU*4oV+2vRUE?CtGv~h&QgmA^b9EfM4MvHt_A10l#%7@gtlE zzFYn1s(RP)&PsyHIrlo@oRs_52}_BO20y!b4?98OdN_=gNNv`Z+Ck8n|fGn@7$O58lyorI(&O=5q8N zD@S|cF+ND%L+nnpW-kZ?bp4RmA9;y6; z2|F()2ejzF6!XYotxv@a2kgE4pg2u2|sgroJ;kcx&CK_jmer8|Zq4-i@+_2jBHG zDIu5x-&HFl8S!A1#xZn_`6z}qNw0JObvhm?VlXHwtQf)2SIm2O@p)zbO>Bw84rYwn zVYY{HI(G4G=DfQ2tdT>Wia(bazT*%T+8*TGupb9?&|li>asb*F3(V|BLT8XbcD6$U*OA1e-a1#of{p#2@52D~PeAAM%N}Fzl)LPjSE-?#~1%L8s*Kq~Lv~ zxIrjmYx!KJ(NBu)!8n+i92ry?G!;E3u6&+M$mEDXC*<%nfXOn7 zv2F;$@tr;i2pB^tpj1F+hmsJ$7=57F9>(ba#kD!)7#Ka|srWr{pbLDH!+z=R@W}6d zowxybLCEwez{4_>41BQzT#Cl%-=tvfCU+oI9Q;&#niNdT!>D zQ-_6QC~eq62cV2G`Yy@M+T`e>(!i(UuOv4qlcNbcDTk*B@1w*G!;0FcPZ1W9p%h^Y z9e^U5WAsaso3_c3M5U2W#}`R%RwhRic2*8g6M_E`H;z!LXZnN@LNk;&!h#1OkmHal zhpLm%uxJDj*sIIa~m)wM;ukg zoi!o2ot}ixfH*mlu#0f`(4PEdjhzNTU6kQ!CLn*?QItWc1hsfIjGC8VnT@D?4 z)|{&3+W|Q_%5YsC;iM=KfQyrelRy~;kfC&8$_&Mf|)(bYXHnp`UuJm#ggRII1agZ0LtWOBtVCi817-y);b~XH61vGoJ=GhyKl|e_gcVd)>YaMH_432@v!^~n zQ_Bn4e+stItd~}Ov~jX;{!8^bM*n^P*>1g_9nF=dX)^CT(_|dGyG-q;ii1p3GFue) z2-%aB@B4LnOK@mX;tTTA`^8ay0qEv|26 z*KXDS{MnsbH?p%>vA^vP_WIdbEL^tu;H$eg#CCI(C(5f|{{Htj?j6n-=5jBK!FuT> z0(CeDirrtj*~Jca%)T$r%+9}Fd!2Ol@Zn7Db&_P~6MkO9mvM2+?A8*=uxp9(9=_B& z<($tIzYlD~k>y81mO`yqy!BUXrJTDMK z@btOo%m!XI$LBdSrn3LBZa2Huc~`HO`s@ryHm>}z)v^vlmz|%~<R@c>c zRKA>2`En_hV>@y69icBLgx+d2FVn%6UThM7r`RkTIs+(nWyZ__eqWu5X8}pqd@K0E z4pZ^9iHolHJ}OVn*!!s6YT?*WT!PbU=f+kuGnbR_N?-1G)Hgy0j(8v$H;Fb~{H_dV z|ZxbY+695o^;VV(KF!ZNxl1MvR1RZ>{JxZNa9Gf}w{tR9uy|V1!sB zU|2?d%hXR>u<4^aKE+g?3>mHVDD{_zVUc_^l%qO&@S2(hw zn!Se$=g~*w!`P23WdauDN4C0iN8b{^w5|Emgl_%}`e;9F^_nxaGXnSAXuuz~Iw>p}EoJ|Ps6*&6TZkH|bk`xbm$d|C;G5L_u5Xb?wg7(F+5q8x$uwK*uWul2B{PNV zdpj#X^mlewHr<5@M|1*(+Z9F}Xua$Q(xW|CgBUT<$iIP;AK<$YKf!bH0v4eK$GnZU zbV$MM^0-aEo@yuuwuNW3(m=dl{o++o)ODFUtvq>osx$pwKvZoyKSs z1atCa!d|OuZ$$tby%cX#80C@;1nfoHw5f!UjHHq>u2ndugi6L}Ss3;*Mn||&vm>aa z(gaM!DQ+|hf;o9AVXsG{5^rl54M+Wso(wusSVmHc78|*t#(IupG&C%jKd=17_uOF} zhDHsKpq7f0Fcl}d(Kr;)$y1E>do-Hy=7#Z*lu2?zh(>`KO*Q4hiEwbq5i>^X!?2gS z;WJHvZYoa0RGjV>P0j3gaX?tmxG7>yK* zrf~A4Q*|1q;;FZ2iY8Aw7NhudCjF362KLiVe_fv9h|SKwK>)u9Z1bM+ri)ST6jkjL zIFz4ebOV#XA7zr!#D^t)S8&(y%qa^4g{YptG$&PUm1Eb?SJ0|x=$n!`4gCn8 zO0@K&GKHG@ruFe@-n%tgynE-qaA1Swxpm`qw)p!y_rAFDK(mqsIh;cN#fw!G@{a~s zv7UZ3zu5bZQ&*qFOLf-9a_#i>E0^cJ;{Ix+xBrJkZ@)__c6$3?NeiT6)!UccyxxAh zL~p-#=IpICpX;wpu}(G^NUyWG5m|4@(wll0!kcpd_oN)eANADHdr1tab>JBr>Ce-m5F3 zhjdy=8NJnOsGVR(>;xg;$2S(rDWfw1-_MoNbrMdJGJ4xaoaHTe2tg|%ppaLr<*kw$ zFRR(Y`}Y@9(Hhj&%5-aE1gj{7MRT~v7-hJq1zvAPK5esD*EVW^*Pzi2q&l}z6P3A{ z9EPwb3P)0zw}WPMH!W($?6aeX1ZBq(1;KD|PDwCIBr1$cQP7+#;oGvRVxFjTcvx~8 zc@fOzT6s~i6qWO_)5GF*Gu`=Gx|;cPr;ZjiLoCdf1#agOhp48Bau6%z)zVC7MS5wf zw`K}R?D1@a+GxMzX?u#6;BAdL&ds8ATK00hQNBg?GPS~>t@AQU^_nl5b7sQ?E*IDz zt?X{B)(7kBU}t1o+28vZf3~oo=Ci;dIC06^Eh#F>JDT(jBxN~;A{=J^__s&uGQ)p2 ztd>zx`0s`(qBaR-;lFuY(y&rZpiJwM&=FmvPdIK{Cb~U9r%jI6bOSwL;BBZZ?0~4A z?5UEHl2<|a?JHXui}rVS8I5~)Zw1O{PdT0O7! zl$IzvaN=@_9AS*APjNrvRDMcZ&Z$481u9O(R8*jfU_B0oXxxu%LvhkU6`|7FsVY>G z&+7{gFzmil5GNGCQY1|%C{}d4h>Il@G)9%ExSug9MI{aAMc7G!va4rYY&!A3V;E$T zrb9lQr0TM`1Z*Qx@G4SCK5tDYg?faYij#|8Q$oGl0+0_(J!4drDgehzB95Z|ku*G# zddl8iaXSlBQJIQi5RJ0wP!A{RsMO8{TVs3W=Oa*e1atFTOjZxXE zXcDJ$!K*qIQ&G4onx^THkxWx{x26f;=7r>yu9EyIs$JzEnU>;J4iHZd;OQP+^(tv! z&X|hIS8>%7qJEVCRd}aC;_)hAd9|yP;{BAdRH15>v_C$@s%Ra&a+O~KDp#@4 z;gqPBD=AS`2clSEDw(%qR+)m9)alvzGjJqIaUa~9!bL;i-t>%dZ_4a)_ohBq)uhmd zx{yGnGWVvn(|I+iVCn)@DZ6~tRHZn51xkyOT#2p@t0pD5ypRTxTjN zNUftdDX%w`+lDlSx{Ql+lG;&Q54 z^+Pp3Ut8}`@BCdnPsO2E>-Kwy%zz77Tm5-mn4wQDb?3$3xU)6!XZ>Y=-?~73CD9&c zMd!^+n}Ij4-x#eW5uh66ESN%l%qE_#)F)KrF(e+Vph88;VyD*6m9;+6`8%wyE8~p{ z&R|wHH&%ADbL>L3++r||vfI`g^rzI%Oq&u=6Xc}x3a3!qQyD+Cn9$(ZYc^I7Fozq` zi^nKBf{VQq#jqV@3KxF&aBJcJhbnWMgTeMFZ8>-Y+F4oM%Xas-`#VDUh%ms4;-qai zr#9!?^cr(6ZOY1W2^?fcSJaaWYUWksg3L0NFjpjz0*z5I&UGq2%W_jORMx1eIG@aD6os_PbmQ6$NUOBCHMU5SJW#;Dxpx)`Hgn{P8O z{`7feZv|IkI*M$r`(x8#b3G&^a4^j^*NSima6$Jpys+5qa!ch<}eBvJ?N<@qj}&7;3N+L_E%lJ@8RSmg95zbna@%#zzLuM1!OoC zl(Q_{fD$?wqmr5HVyyaQzSUurP-Wm#Q7H4^D~OY%2JP_(^x&1pf?=o<%}F2#g=7Rp zl&eR%F(o81Mny5##dvkZe6vGoqRP;xq7>%gKSq5p*GYOy(rGyYS$G97*GGMG#}UvvnXpOHLWN;7Vs|TV)(j^j-oLpuYi1%u-pYQq ziA-1)Yvi}cnzm)gNgw5f%^brlDI!|%vrNBRpbYNlSF=WSKY$HZ>xrn%DKv6|A|0;Gc2R|Eg%&-(`~}V zDDC3+jsv$t)W)s&==L1(0vJu+?X1}x?nu{FBdOWAMdH_&apmA0Xt4dPzT5xXet&DV zUx@u(b#&MhM~8B&$IV`R64~3mO{60t`t=jlSer=Cg1s~mnJxD?;0M}k!6jmxi1s8g zY_o;-@+G0!olj)DX`A#^m`^O~z0In*>K3FB_%^kGb0v%5Y!|`V2Amy$)vghplDtoM?;TZ`aL6&%Ewh|`)at20F(Vcl0>nEe!EQZJDBz;EjU@>PWV ze(wK~&vjyDuS`=KSkl3}o*u|rE{0|sF*KcKHS0sK-F>Iw;XAf|yJc0@+U>M{r@a2M ztM9_ox6|;-*Hh(J85|OPI-9xcGuN+;psbRczRGvN&i39$nu~iJNQnh zugA&jHhkqSg2<^~)V%Y{gkS{Ytx2Dp15_vUt}k8jAqw8EOu25iE3%NNb-N5vf*5|C zOnhDXs#V0>i3+!`TumaFDsBh$t4UALfbdU^zP7Jljn$0mWIE+)S7OegvOLjqwX1P6 z2>N!eZiQDMD(>VfR=Gl#I`DM!<`mL>ia!~S9^+e91-{`qzxX2)g}-_nI_Pd5>X_iTES4%x&~=Z~ z1e4+T(wk-)n-gphcyJEi0KsO7hMueeuC{|)Lsn%m=v;?>8;wqP9-vJI1!UV z^@HiFS_ln~$!n|H44zClf~TXa8Uis4)64F(rhbCyW7JX&0h|=3j~eV$v{S>0m=vaS zA`ZQ$d#zLpy57sCj_V4>Fl;Y>gcala7`0L3xtbKlj~?(;v{2*8m=xCQWE>jrz4oaC zU*F`@M|_22DCU>54~kKLj9RD3bWIHRM-O=_+NQ~LObq*VIu4EgUdz-DK;P|C$9@H4 z81ie0>KFPkYL~`yH7V2|Jz&a1C$35tPsXGWUnk?xc#nxPvSSOru&}0%_5#H)td|1S zk$#L?q|ro83g<@-cPiSW(Ns(d<7FxijqqM;)B>-3+^J){f-wx`wM2ECAEUNtJXe!K z`q2ZPik4_R8IwYLos2`{z1I%4;6tD>b)*Lj!!W)?JZ46auy4kw6&g&@q;P%2P^Y2| z8cf5aupHBHXcYHapcZfl@urUARPHN?`x1ayeMcXs_GbXVq;R}MXl)>YR>L&3K7)Cf z6p~{e4vpl2wx@-Bb+EOzvBz+KQ%80W$}pVwr4E4l#~^j}a7>BFM4qehIzF$3z zlcERTi~NuSlfWS;PwPui7ML#w8w52VCQG-RsptQF^G4%pzYx{ z0jAQSEdr=B43&APnIrhHRqbbj1|^nY%(je}3)?cG8Ss;p@B4MClv!vBw@V}*dqf8) zH+N@0xpMhES}O3zJoN9I%kt|TXgxRN7u=qOh;iIp=d}B+z3U&LjQJ8R+2Cr#LMY=qvs_8fyEYW%HH7n z{#N}_|8W`uLL0fHt@xwzlHVRK;nj4B?+ook+P%d7FIBHw$>}{|J*?yV%AizkK=H(3)Nq;C)Qpp&_}&uHEKHRz#lEv|26*KXDS{MnsbH?p%R{kQ$WUOzkgeg9du z_~5I%H$;_tDm?Ao2%*Ka3J-=YDqU zZg%hP;euQ=8?7vc_@$Q!@3?_04t`-*3ip$<2z9>4=aiXSe%9-1dV)O!l-WB4f^RIJ zx_;#{w-an4OngHUUq&MK6BtTJ;;)d{Z0QCh`^Eg5Na)CB!$9(~JIy2V{jlw6cK*HE zd)#RLcc%8syg zd4`n`cCy-=HNe+cmM!U*wYSf{5^YM{-LKyXf@N4VaXXdn9K>wDd&t%V)4T)hBFDZ1 zO=9;cjLl(DF4zZ#(0R+EBWQKEUI&GDv&Hv+oh@apcKc%E;`68-2anppGq{QKxY@P0 z7+h&+9GFj}{bQ~qO6LZ za%eV(5A;~47U7Unv273|3@z&?fw)sSh&Gk%S7;DLi$*?6GTTOfM4PHv+rh2Z4IR1(SgO|&p zoQ@XF#azS{Ta8!xq1D=`CVGIz(9Bk>qA1C#qC}O}t)gf~aOny!sjG+OP>^x+4UO_F z#1-@%P*G%}NuO1O#st^e)Y%?!Lmvw0MO1Qzc(xMm^g}B(8>r>(2??YweMB3?A@{yW z+HmP3+5ke~UA4z35M&${yn3uhFf+8E)Ug`^W{Ykr@Ro5yI+TH+v!@FNU=0LwoQ|A% zpfe$~vk+4Iwr&CS^_{*NBU&tQ5J$E}ZcI@sFeYphSQmaO@`fow2w{TKRG1Q26IzIr z;KM@PJHl^nLE*QvBDBF)n5ltQ!nu&C>}y~i`E9vI<#BFobv)L#vJ(^F<~;8XAM!rc z`|K1SXdQBiBqWYAu5Zz}et4*zr$MM4{>DRZI|;S()VA9_Sg0Mlmda5a9b?Cqud;Qz z#f4;=k3RPe3(~EAw(!9&coF?wSc`%w(O=&{+Dc|HqmGCvKlFEYS2i>2Py#zkwh&^I z$Nk~kBcwK6x;!ij#uMSq1_LAE;f>ckE(5rCubT&RqeU)fvjMK$xA@z9xWJWdf?Wtl z39Vl9MY$tNaHP*(k#+un<@p#;Ck9-Uri4*ye^#5565?h+o(ppEkP>ZE`*K-rHqmN; zVSwJ}-y)2wGqtxa&w+!`!ux#ofxhBvZ(U)DIhN?$p84=)asfP`bifh<`-ADOr5+EM z*MiFf6Y7b#-&S`OBbJNLMizt-dbF~;v05LjuR~mclYK2qLpfP|5&ZglAHlP-g@sJ^ zNE{CvTaU9gPK~ue_78*)ienMks#Q=;@Z!kPOg8yu~vNf@nseqPU;rJSV#;1 z)H5(!OisYcsD=}efslf8ff(z1)#n(%3%E&ZgUt=_llJ;gw)u(|Tz&LxuMfL77^E)% zANdNzBU1gBn1^YzL1s~N*0_y%-Mfu>Yi3rx#@Hh2Z=%sYN53z|4a{$5W*=@{Jq`A= zEoEHGT=ITpKAD+SpE3l1EHcPTUxkCVU?{)8mm1hppxe*2BySL!XM-dJ5xl2#0+ia!~tE zvl5jZCx$gs6ZRmFcSDf1J>a8jzP5cziG(86=mYfA)qd^w#2Y9JgVsG*EO_lo~1wd@APe0sI7UvWEkEJPI{kA6P^zdj_^Fu42P04*CrcUH=TT_Go6CnoQC9hhAPxm(6m^vI_WiID@))D( zyzgVY5u1W`hto%;;ZMbkJ{ZC=Ms4!FNC*eREeD{8UWsa}zV!<3lIrD74|t?t`HSH}xbO9sWC{P|a34{SKMo>kGZjB#GLK0&%<@bHm0mWqL zVf3)4V%8r|$z&;kYj6ZI@FxDjAZUnj0;ClHV+0wLXp8xwBxEp7bAR6nU7Jsq4n~iA zI;Q{eoJ^JwxCloeguo3zFbb~=aS{l^LoBcV=quUPii_A%2A~V}{7w z)^+HIc{9ZC_{9)r%{iY74YO94Z8$T;t73-8XjQO?l1OfCm^`AUwT*@eV(lFmA7#< zt>*2NJJwFQbFp*bxt+2am=Z;C(&dbTdGzHICuOHBCdoL2+slDLw3s9VED2&--6YxL ziz;xN3m_RQ1;IQQL#t$bfLN_n^5S!=WYOani-70BJk`E|b}F%9Fk)>^GMH!F`2nqx zyVgZIQ_xt| z_#DyV9KnytQiJ25dPU_k^d6ZVhb>f8&*1<9kb-g4;=&(o2#Um=^~CDS0PFsd1bnSv%vP>JU?7UrO4M8IG)teSva= zV_$|`qvtlqG;!8P7yQ=ojrVZjH-;~h+JyS4(`(=lqs@+kDjrEIY#GE8YimAE6XXD% zYTNe^6J+0(V$#OZtdMD>$pz>bTjH~LCO5?<)7u#%Bsr~<^^J_z_Nv|{jajg*`5&fc zO9Q!!S#bL^Yhz5CV%%9^{CqgeU_Wfdf>PsPDM*W4E~dBDEwfoV5PmG2SHol9v@EBX z69)iRTVt3H!}J$h293?18}NEVU4H~~o_)GC;6@O?YE4D6_0+!0RjK&3AoXnFXsYkqZCEC)~6>jMH$}x0y5B^;si_JQb7O7{22W zVcH&KU$h?wHP-d@Qd3=*GgU*~2#O*Je^j98Mqmphm_J4nUE9ML4Rl?TdD9Y?Rc4%P z3rxo}*Ypy>&VI z;GRC-D;z^Hznt}FN0aRMV>G$7J&e`h)-^f=`zs83DyFs$b_H;96rlYbo(8;$tsjDN zgiinwC?LbBpqzbe2b7S(7)@(!592kgb*&Dgg9^i*ib<^l{um8vZ6C=ENT=lRq~J|y zZ3ojfq)p%$N(kjr7~4uh2V*p$wLOg0fYvoSgbXSSdMc)~4t51_a>s%8cX%4`CbMn` z!uy;4VIW`(rGQcVSu?$Mn%1Knz9q z64fI+h-9Z9r-`fWVtfX!uEiny{HXCx$F$W!4)7+2@aXLD2p^cVI_NjHHug>c&I=er zv0h3XV4EMO?P@$*liTS>k9j(ls_}eG4*O+3j)4E(F4c{|Ys^f4Amnfy zGG7nLb8Idt^X31wY?R+FO+KQl)l5$~Ycjb(p(Z3R(Lr%xXSkfFq3$_&K~=>3EN z-j72rY`~ZtSyUN!)`Zlvl~>S%?MObzH4|Z#rJ*-M^QUErdhr$w5N#P+Zn>z9VdQJ7 zyrp@u?2VvPJ4U&a`j1zPt&{VlO>W^sm4YIVh@fzK7+1#H6^Bj2Sl zvW@l5u(I%Z@bCPu^=Tl{-fQ!3<1dmop6!@FBZ$1b@!GC%8`jrPajur>LlCOkuz*p=w!7Up0 z`(yT*K>rBpGlBjQG!{G~%B#o44| zB>Fsy{|~;5D+Qmc9$C4N@n(VL37jcd z>^Vem_z~2djc~0ns(PiZYC_voq1y$AjVkRHso&7OAn$;oXB{x~dd=nb^FZ0kHLVgT_(eQ_L}~?hY+qx!J|~?@yH5-&-3{hJBYBK4MLmpX;81r~BHA#9FO$R5i2$~tg`5V?c!wJWKW(vw2q3c}Ua<9K-A zNhEq#w~8iH;sV0et)v7Jx_@vrM`;bjt{+^r3ere)$192PR^e*OHD&k=H5rNCy|&T@ zT*h#92e7`;ioVp+Cd~V71Qc*OQsQpH4#qi~a0w*4iMg8KRDy}?CIr8AWOx~RK*s8N z!VR?C@q{Z9@e*@E?QOBTS&XQ(8&a&`EVvUD1Rh4;K z4Gp4Vw7!WFtQ!hfX^0aFTSi*QyP&YyShRT*^EKV;&Ah^g`N#OA(*u4=Mt2#%)+KZ{ zt~q#EOC}$~e7)0ULf$V%0bsZoSim#}I{`xo_ECVfd)*K){Ul)RE05k*%%E23Ie4)Y-nK`hwQb_bF;5^?T8lyt-$ z2xzCskw{XLta7>_X(?_?O(1tzvujkM_fu6)qt$>wx@ev|6qVVy zM--cp5ERI!3GI3$ji((o!{ls67OfmbK2lWY0S9UZ5o8Ny(W+71Uy9;Z;(}a|oXVt6 zV$7kOVWH@so7PFE4xLj zN}K>1bKBwyXVHoxgfo+#xGr2&clcy;Db$2HDbtd|gV=l}so9;2Be+HDNL2S5bM4}Y zX3-kLqM1oSTsJSOGvcm%DKtc|Ql=ussF!>lsoCX=E4xK2Nt^&0bN}KBXVGdRgfo+# zxUOJScYrZj3MBy_Wg1d|?#fq>n%%-!B3ra>M0C9|7crJt7OfQ!%Sb{%8MY|%Oq(f8)u$XIe&v{FDWGbx4VQbzS;G#MW6OmO496uP0g zDbo;5SncGuZdWrIDK1)DqUF$>`yk$G>hSrWhPw^>W%76_(;dlj zMa`Mhb-QF{(RvdpgXVnGc<*%4I-_1o_mk<7P~H5?cl2y&kSUUvGL4aB6*Xo~*YJ{= zMQco?44U&?0|pt*C>dR}#;Dgalg8v<$`5yTzh54m(cF}2jV7$9H*>n4*X%4>b9BRH za!9(kY;MHslhPf{>Y}wrH$2-OE&s9};8#)qa(v_%cFHu!P?ilHAcbv5X>+=^H~cJG zhfK?5l1RF^f^Jla46lpUBGWSO+DMn8JgF)5SI*S(FY%Y;{4Cm~+F&j&)s(Do9P|4P z9Gd(UagYf?zY0se&gR9H)z9(N`$j(CcVC$GAqx-iy;WozuPS#Ps}0H>tI2{(~v@ihLzHL+S=vSwV$ z%PzbY{p=R9HrZ>@DW0U)A|goth&P?GCnQ1M=~KcM8E;Mae`#&6w=Q4#=`~oIEztLxIx4&=zYcHW9n+`WO}%>G zG&4}FN4BXdjdFfepP#mAc&zHZO|>CqD@Cg%YXpnik&s6>rE>*N-4sa$zizRdk*~K{ z+A{xdHx}Uk?b*F2x1Yh=*W){1+`IcMdGM(H)#Inhz1w&1^A9)z6TfHj376LE6Rsl9 zVLx$d9AFWfv#U6A3nyH~ky|+7Dh@X6(pB6vbMori6<3bK@+>V0bn0(p+O5au+%%oWlpFL!r^dU0?lC;6@?@2DPU%X;c5;x$c(Wt1+79i+Gksym&kat%GrA2gAC9*!aH^lXU9$g`h58?3zU-3l zwR;cvI55Oi8T=ds3V)^w50ulA?v__L4Ys_!ElYbYPvo4;{YZPErYEYfj^Ldlg16?A z_)Z7r+3hqWMH_VLcdA{S!GD9Hr}A*&pzHI?_f`2`s=D6m`Q`iJ@>{z6rY;W`FSTQ5n7k zEr%hBE&4(%J+vb~XfSEaDIRA5O06Fs9_6-A>E#^cy4%xzh&3FdZg@`jR2{Jv6{v!? zCpn^s#G9i6#+ByO5DUhoZXD&5j{+>B@Nr(@IAj+}tBqL>11hWheX@f-@iCoKkNnCm z9hdB&4{tDkXp4*pUf`xLQJ?ZT+^DRGnrN8nvw)ncbY4VVn}yB;<+yeH2dXqP37s4q zPEL{yItj(0Wt$#x6~U(q?JjTnaF(`>C0E_5P#z%C-~j{UkAc_^CWC`H5n-^HV*Sg{t4eOxGu-5#y)PaPrei+!xw!BHx3dq{#D| z!~WhlFpjDQ2PWg>B@X>*->hBs(Ln<{)6*NUE^WYy9rj(foZ``MoM?1CcX-!Tz0pqk zzEmajRyL)rY%wQ)u{fdM;N-~TmIm+9-e+i?hyT<2+>`IS5 zZ>7c{e`}YX@%`3OKe|qpw`G;7*sdcl#de)O`NWYQzM%38eys|MtvVGHzBhG2)pW1p zwD>|6>F43=<(Ki^7|1S5$_Gh6CNqgcTPsT?Zf?jTp%ax zs-|emFISD^KZjUallArF#m)~y`bZd!ze{>)cm$i}rhEuvuK;pvKGta|qQ4vK%qvf+ z?VXc}aTTZrWF-wDPs~)UKQgO~>JsOHim%AQE?fx02lpOUhHNZ0jL>Y@wJi#a(pf!2 z!=ux?uyTgSC5HUlE30Sj{1jo8I+8?u-FJE)uHY99UJ(6aWp#Ue=NwVd_@^T$K8(RZ z5{+(7=yOoFPcghS4V{7MgEkB+9#H<5VnsKA$HU3#aYZ+PqD*o!K@h?h7|Yk-A=~*{ zwJSBQ0Ik%9T>)k|A%IRK0M;p+bp_~ThrXySBF_&;7kk>8Tmf2*2yq)6!z``2DE|%CtjJRnw0eZ4I)r zTeOD637`>IfLY-zT1$j*X3`U5UEp*_+zl;U^UW~N5Tu& zl{gVJ;tDWFJPX$rA)cAk#aI#89m4OII|s|L=aRgXsf#45wzAad4KPQ1i&mFN5j5ft zFh@L#Ru?Irc&i(mXZd|%JObL84I16JY=~npfv;qyVED4}=_k0T9ge@7d`}9El&#ur zZd@+RxX1bD>^3)c<>C$q&KwSL8M;+$a$}WS5|bO7qui|s66bDmvwDfIWWHKCdy9^w z8IpZt<*Yztzey+DIPI3mZ#p0UoSxV&MrQ&c2!kAy*I4W;9L}4-c{meK$tq^Eb&<*m ztC%ZiK9(omm%Eomnnn7d($XeY+FL{b7+ad3z$O}-SO9wS|!><0`* zY?53<5n1=uggu||xcU|zW~MjVP_JQwOfZN`>kT}-_b5UBzu$g%b-j8ZoXfYi2Fatt zNwRmidrG$w!@VE>cw>K@T)}`yHlBU+)jek*lyH!5QDF-VQ`DR-D$cF0oo}5d1p;ce zb)Ixhm_OXblQe&z?DQJxmo|T(_-4Q;knMxXB}DHQ)uHw6W7aoTL)=X5BcPxt)H-+N zN4BaN?Gak%yfwlCvJMJ$BW+_1n}aq@Yi}UOaKL83exrgixtziO-%#-X8`rP*2Cw1& zbV*5fqVe#5y2Avr8kghpj+3ucDUtr~BQYL9Z@scO1pS~RtabZrt&8h;Jfi~!L5~DH zLq%RA=plq5Y0E@rDMAOdBg+yEQz#oJl(H51srYrj#OejJ$ra_5mu*=ir zSX$hLMBBw_M^ajxAg6rhmDhd{5^XiJo{d0m<*IX=Qa%72ksGlbMo=N`&`K*oJn}%8 zYl|g~RJGIS-PaZDT5vlRx>Tbt=sQU=#K;-!pmKL+VRWh8J8wVN&Y(*zV%qqTurp=E zQBNkB$B3UwL(fm6(d?%cU@|S1xL6jGX;FkRnHG_VKpTn4gp-EHJk2ZY=9<_R0k)%T zXCk1RUs!-i`i;HVT@Nt%g{n6Im<-_(t&WLh>}5GF(Jq7Ekvc^$tzJ-K0Y1=TQM@mW z58SlzfdksN5;NB#KO%xI0ihh6-DQwwz=HHT{*5vQ64lq;athtZEo8$1 z2}f8FmuGcQytfb@Z(UHXyTClVIDSXILRzrsHCiaVf88GAGpYBF23Q;ISBhCXPEa6> zR8zGXl$uOw7@_8HLFd+y=rmm}i%ip5Ay}3q@UDYuM5H+!m=nHP&}h2K3=&P}ly$ce z1e(L$JWjD?13YOsjm2N}=wd$NOl8o90Nb2q&}KFhc^5l&e%`)Q=6j>PMueHoz@i3w z=z~Lbwh=^`Er>-8brQtXBi$g#6zjAdZhWNk0X3EaI{)6Vj8$wV<41aph%uXiMUC{( zx3T19y%B_%Er>;pbP~kWBi$gv6zc*$)A(2yY!uGx!LtoD1YCq}Qy%5IKZH{53NC^y8ydKmD)ym3kQK}Hv@kRhzS)nXSA&gL_ z)(Hd4Qr(z*KZHY&o#O_hzGPV`(h0+GyiU{@r!~v$qI4pzOfTS`cPvO)~wtXs}N-!ZzKk5Rw#>A2@=ZGI$!;Gswh0?zGZ z54;P3IwP)HGFsHYFX?MD5mqfZENZMn4pR?uE26669F_x(k8@EYRO?yqnw7s&UlZ9dTBr)#h)}w>YBKxDrX4>d2|qz0au#c z7)e#^7$U&|X(yS;h*o>U{hfo+&Pnp&?%~m^HUWQRp(U|GQrzTDf=HaZ1rjh{Z0|r} zB{%}l8U>x$TK)9)Epi?wgZ>~_2K`xEUHhQ*0pZ17t+YP4h4hrImi~w*X-Pr3DS1^C zF@cEoke>Q%Nnvu~bUqzW9omxO0b5eQ#k`31Ln!xFLM2r^pZ8iELgGs68vKMY+$>|m zWKOWmce`i8^x#*~=1Zown^txD8|bF_TnLBnsb0t2jiM^E6k|VSDm9|gk}`tA4k9lc zkJ5yIg_X+AwXUkvGTC5-*z!!@lmfz33xI0ZCJLrLW3r06`>_4>{l^dQC09WG=hMT< z&^MH#;TAHIy8HOiXAhn|c>E}NcK;sY>D+$uEV=ja={*ryhksDg!>^JjUrlGs)$Mj- zths7qGT+`yy*{h}bGG$*3)7c~oTrqxxK%-cBut-nVsJM zTWMXQDXq&>+CHA-lt#JfZ)g(ZfM-N|iYI9tW^&o!lIqY?+GC#5c&c-a!`^DW-Fl~m z@HnmauWau-^BFBu4}LYZk(kkjrJJ*+H9f1`rBGxWH4aUM<#Sbz9b30A4cP#J9^lJ1 ziycl^@B9Po7CDP2r9i!*>(@rkwygn^tt8 zO>FLk8f8PSI7)*}k})mhZ#CDpP!f}w25t4oB+m=AqN^*%qmxCSwkK5O%Avg|1~8zs zzEj1@agx*;Vd=brF>o^~%1{))Yz$lnh4pggmDlNoM_36qw~1Z{y()BiaTQyrLhY)( z8dP#|1=n>2I7rW}q5ReXRp=-z`n?q&-{IgErF8feRjT|TENEaUtI)=k>X}Avr0sm~i-_!{?u}YfWj%D-HyLiaM5Qt9-=wA?osDlW?YJ13>}7ceWQH8&@?V#ZhOu zeXF83L%rw@0}B8R;(AS6MPvfSh|$DCMzD<7>SR>CuoP}jH|Z119QRTs!o<_j8*M^c zONb4}M3!C0&=-{m=16&4_b;u9FdQ5{U5DYIA?B35kC8_PXXNQ!s10Z1O^1 zPm02aZ@?0wrg$2v1sS~I_Y?{bo)9@cSSpT4`Xcrbk7TtNM1+&ZFJZ`vE3%tmy2PysN&>5zjZ^f*0Xfup=(~KFj!$lsR!y(99D-?k@ z@@uqYRxQ*RC_`7tJ40uM)LEeu4@I!vh&8inorSTuVNb${M=)t7CAh;_H0vDtBy4`v z6BmV}K6HMi`r(cG8m*dD3vFV-KtN{kR-vmb81KLtUEzJgxl=q zwZZUGs1Sy%!pA_3md`n|Tbx=%cD@no=N!Q-PC1NVrq>T+0j;~TyEEDS9!~XlPEUr* z@R98DQ>Z5{X$4)W(IPq^$HnPO1tBzI9UTzR;`GK9(Db@vETwgq_D5rcnO~mu#pS0^ zcU;m6x>KX^bU==a)13-JXvCB{AfUzRjw_&e!z0bOJe)Fy)jFp^%Oi^iadA-=3h74e zmPZx~X1L>KYmc;f*vy;1JM`8oUM{lpLz0-P!?x*)wTJPMV zOLWHKe~BlF#i!hKK=<4ovQi@2|DY%MyGEcElgj~+s1A+A?=u#kFw($(;N~1RF!&B**?V3l^{3!YEaly(D6SVhEjkX`aiBwvKeyN z2pb9^jKs8tLOgUrmO{vE-+B1>?w85k+t2RaZ{K}*`?pW;JxzY~;L+`e4`tqzCPJNl zjEPVU?ByE=={JZ;dd}8C7cip;>!3IBOIQb8TwQys^%l(|e_Cn1MRU%8=bYc*NzOTx zoBnUiGQxO>X#a>OY5${hMJzU|L(e%kdCn2R*qq={7g}$&E?zm~%r`V#A?2wpf6QQR zbUvBZ$|sWjkZq41My8&Ei6qaer>m@b(#;#2Td%Ep7&%1idnX4<&fQv6UB<32`(kAbC>|n*dM%(V)fcUr`J!7*-M{5l2H&O+Jk6B zAAJ`P8g(~Wzx;H=-joo+FJR|l26Y5(3Dsa{gWBxM8Cg+y=#aQEvviXYcjwfiW$mJi zMqNBoVZMdPa2$1ALqb!#alZzgk!xT|9B|OR}@*>;oL>SIh}N~v@G0Y z%T`1;AO^m}4T;!EAmKX+1@OB7xme&HwX)j&TmJ^!Oaex5*HeC9Mm$xoKji|MiMz zY0~eB&jHVPge^__1JBZAu$fC-)+HD#JC-K=NRk0$-|rRC7WYb_^%=aD^SLbcQW2rl z)G%WVuJ|@DUUTMWY@%6lHM*D`X&Io)x)Vil+3T19=}M0fg)(aP-r>RMWYV4tUmUgD z-{Jx_V3(rW6WY0W!<4sKwcr^8AFaxSgwDds4O6uJ2^AKmAE>L-LXDl?f3Dy!4%pV- z<@#Yf#h!xRyLFLH+6Jw6*`x&2?+JAxg8p#jBUVoQCe=s>#_*)GMG0HGYPiN5mnZ>? zfh^x@5@lPWi!N>)t)tC^%{*v*5T;Ad5BFYqJ38VlPRG_^Rze3{rn;Szi7+(bUf~)V z1|+Z~!^L!X`2NG0mxwpc=ZRucJUt$^RV4HscI>}?`{}cUDfVHMu_Hw&CW33Q#db~~ zt@@0GiAikO#>8iYE;A#oOzfgrI}`1)Xm1VOYsUJ-<0B6g;F08QEDVXK5jEPNm^Ny(La{2% zBJ!d<$mJI8zNAO3>##U=P6H{6t{ zj3KO~Gc_8zu}HM0XkXVql|0D?m|c38^!%pewJ%Dnxm|n+Y=L z%4D&+0GZ692v)#Bs~7Mty$qTFHcB)B6xB3gJ{RX;W3if0-tT4t5xQe&v6?`mB|0LZ z#i+a^w1N^^naiOF4TdIkWMKw5kdw2U2wQdYeTOm$)S~tbEG90C_Vg++IEUv~+jD4}L(MZS=kdO~H z9C^VBEfok@8Cw*L=_gPJU1cjfUcNN~X3{*6OfK z)77+g%hfs)GGDd^p{}rOrphy7)}aae-G2XdXhISGU`|HNJs96)!yTfrY$Ao6@dG2W z?G8+A>j+I~hEI$Y^v3Jxgq{8brX^i+&Cpjd22#WraAMrOj!tOg;YCO6ZBoD_l3%~4 zZ^Im52A?QRD4;DPpvEiDr=cShLWkDZdtTjoQWyGYn7%IFNvlpFR8$?-88_3 zvbODpAZ*=kX#Pg++sSe}P2r0Mr;RFP;kQ^(tA`+jMZ9eoE*`o1PR1~tGK&qv^8zWF z*obSeyv4g< zcKPRRN)bgM8&|iru!%}cB}m2#+5XO&X1XBaa2L?))NF_#0Dx5KXJN| zjBtu-mq$2N4yM>AXAS>I!4#FRi%RzH%9TRE;@zp!*u2}x4O_iuS)q&gNV|8paMtqO z%?}xX+f*LJtHw)wyOlca-`#pM7VvI%ln5HJg3t0fk2`(472faK2~}<3-Lk$lypv0N z^4$B{HsVl-8{78I@ptVuQBnL&Yzw>i9|t;gE=f+4y6jVV^@{R|OoT*@ILjxe&*9|; zn+*ab$OxX&GcV1@8BX$`E*YY{J&#S~X-bV&@pdaU+QmE7X00Bb?9fqTEpN9{V>Cyn z+7c~^5>79NEMi;L!qTSha##q(6T@uE~OQJM_nR2ZWbQL#ZHCor_iO>KuXYtD7 z)Lf=Fkz#1X%HHXSJhyK^bA*UyQypV%?{rEWMlOfu2wqARCwzWt_sm;vYBaXDTdCEa z%c;0TZ6bxxh`GJf55ef-l|~MxXdu7CGzlLcGRENE$!!qJ@9_~A?Q5&{XkQ*1X4RlW zja3}ZcQ!AI$Pc}5hltPVKA*3edk*9QDgCxFm>vho#(U7KwAm z^sioGr@vpVoV|ssnN5zlb7SSK2)Xkn-bDH#U9AjMl&{a}X^T#!bfyTngYr7w&J`=( z4tXcWwN2|Hl@l?(uAKQ;zT!-LFQJ>#i}Me|S0^|b^C0;$)>1SmU#fd1dY4F_JA|H_ zi9yB-!c1f>XP5+V?+#5a@?BI;sCG4|zJ>YL^ii_(O9(;M8I(R$EY`OXU! zOkPfvH+V6Re4E@*k)<|!z0K>dBTK1(Pw|nZ7%PqYiC&7(P^vg5QUHWL6651V*{>`H zEsgtoH)a$+(|$q4jG_cQLqlH2jDirB2{zrUw5cQA)^VF?XXnOkvPTXO2_gKiO%_G~ z+f?fw2H4IE#&NQVa5Y3wQH=w(^Z2a3^h_u5vA|9h(MO5k!odT(wL~ARpc&&K8 zOsVWG9^Fr5X(e{lX|Di1YSVFTS^TI?5=M~PR7-{-RnboT;5;_V(O^fXP`v8Ui+VXa z8BKtVQGrDG8PRsf!({#EC&}I+qKJ$SCkX%nBc$ylvH)TM?YtZwpX?kY`={ew3Y)252sWo|7Qp6YhrnAF zk$0wDBYe$jq)zmjQ*8#k=H$k7zY*wKhRb=JWm}E#LTf!&#jQC-eb}0v*(hqwXC&{| z$EV5Lg<3S8cGL)2vl^)pv1Zqrz3s7cLwGfdrWv@J#lYOqYE~N=)u@J5vuesh)$B~# zJmaIJ8Kj!eNSS63v(+@CMwptuzY;NV< zr-7&0nc`?-DRe`yQl=f@vlOda-pWxUG|g(HR%Du8Z?T5N37`>Jn%xP(=AyMkv^tZX z7)YAa9dTN-9Eu`%Dbo#Av39q zfuY$Q+8dqh9*=vy&aRO*0AWT*`i&hsQoSF2*1cR}= z11~U3p(Nm=OhW?hh^*dtd$bw@zgUg5!N;O?Bckh#1bgwsvS_WKH_`oM`YQ<&;Kl9; zTqP}qN{~Bt+_(^kbVH)b=rYq|wc3hNV{8|Xk439Qz`>Zs)p{e5T`UIL;BnC^L4zh5 z`fu|pPrpoD7dvxFG$PuIf2Vffzbg$h*a60y9rtfn&WBnG_TTLkd1D<~U;Mv{#(dGe8g*Ro5ST}FdM3KQc7g5jMl%SyT7y|>RxacVQ zndfQW9-{%11Dhn*;vm=>86j}HVNd$~=?xRq+Yi|#eD>h!-6s!z{ov8%CZf;N9b)>GRzIHPv{v%$2s5Cv?8Jlor&#wl*i1bLq9Q)M(U*u37|dTlhJtRCWx zCg6GyYC+0l8BO%y;VGMlv7Sj}^9tC|_3YxDh$WPr*2mjiSc4$S7Tp^dv+K747-n^YotfRry}3JiYgNe))d5 z{FW}isml-i@>{|3*va8dv$Ob)D&OyV<@;&4d{s~N{ej#AVnfUh&n$DV%s2*(u^8cx z0@q~3Do|iCVo`++Ml2%VUc|}@nu}O8zO{&z6*LyHXx1~fB37ov6qFr)B-m=XmLg6a zaTmYICMvPl6lpGES7m3Hf|3&QBG2nmPEBIHD(x8gkJmoiZBDTFEG>K;g|*XmyKvN@ zO3>iNs!7|s*l9G1>+;)f3mmT5S!#=L(QfxAYzAXf`Db=Vz7dQ?OeaP@Jzl7vB*uuJ zYKtUOMBecGWdshyPbCbMpGJs7Kdr!m#_ALo%No#F6k+=ri)hKrXR)b6qO89B1ck{F}aNMr*BdYm-NZo(Kd`qC}fogt} z3{c?iUF5#O<|u>hb-{4!+-+`}nCXAL@)7YT7b4&A#FBlq9gtnd8IPrN()?VX+dM_j zuDf)zARRUA9UhF}h!kcVNA32vxVMM(OP+y|)lhZ&BFEqN2ecQV-Li-pM0uO{FYzd% z4_0g);OrZZu!`?)IVHDb$yDrO$oL4m7~0r~?@oM#vJn%^=+oZXMXvHK8kqlQrS;aW zix;WF*2Psp-Fiz579!|>vGP$1jl~leKj+i6YnDyrPFk4V$I8e!ub618*?$^Fn?+bvqQXue*AN z-aw~!VdV_JW}Gp+y|Q}d&QGr*SCWXmXr~7cCSyhP3xs+Y-#KSd@g&jd-CTJ?(R{kH z`o^8}Ac6Z`-tmf&rWl|vx6McN#(zUIilPCd-GTYS6P9fL#+5Dq*i1^y7-q%irDO79 z63is`;G)pc>4cXIdePNPuBZg=?siV`=WrjUf^r0eZLmxm#sW*HHEe(7@j-Wikyo8o z$*k>_l^HTU(j?x6dX08hx`{fiuB=KkHdj_&dAA#}xAHig$IYQ`!d0-UmR7nNR#@Qr zy0j{Kbv9~cWjG`@@~+WcioE4SQ+QfXqkWZbqDJc~Q)d<*Z}Lbi#hoT^)@jzz7h4YF z!dBwzFX3n3RRh1S&&Tx$fljvHM1{l}hCW}6! zumU!N>2=vC)&OF(crduw-5TwvTsFE$wTd#;7Of5i7E!u_^+xQWbn{9q3)KoSB4$tvV+UnAaxKA$rIQj6(OSAjaVjmB3Yy&h`|zVgkdFryoXinH5Zn5y}6K=tiLvEhX-wIpU2hM(No5{Zj5 zx>#L%tHoE!-_n&bT^llH`ZGL9%rxbuzoeULw#lH2&Zl@HH<>W7(7AB4xzS#L;*rsb)Gj;;T5QZSv6oPKSP4#5|;0Cx*gAXAY;6C~hxpF<+Jtdcz z!#&(wk2m(m$=!$TukSy8crUpE>OY?zPKL=9__a?qo_+JxJwB-yFDYdA@a2Qgo+kHx z_tldrV=`>T7&^qVkZ;#uq=*@8&Q=ZQp<2SK;lk?Ln}BUV!**9%Z<02OAShqpNopfU zI@u&`)L~F4M!mFPFuAz6Njp@B*2W%dBWo#MqzTPHYTP>Cx^U%;t&B9*NQ6^cFPIUZ zW4dHzMycMkwh5-4kST(B(ON6=EDyTM@?h(FulG7!gO0Z_56c55hJ!M3;6yATJ%Y8w z8yV==E6^%(J3?C@{$?MGDAzp^3~IaA_e>1v8Omi$43L25*Cqx+2(L{H1gwh&XG2eDGGUS z$`#=5H4#^mMcwQCFy>y9R6^Wihxr>`*#;tBQGZSBAp!PLaQH6SQ^9<`+l5U$0n~v$ zeRN3x)O!N&`h|sdr{Adct_OAhLe*P{a|aBTTLSi;nrfZnNDaHHtbpjZkf|{G2tfvn z{sn4rJKfw`XZZHev3OTds14xaDq{(ztvP??t$8v|zD0{68<<_O#0#rW#bfbORlgxvu@@6-_oceFn>u%l9KVp zLnsQvuZ1jT(Y&{xdN8?3`1*Cq!U9NRktek_jfHiQ=T4V#YbhOC5NN+} zz~o@|A^0rPaf>kfog&PBN0NxmT?n&JUnE_8PLmmGw|ALFj7;b=j`CBQz7!1s^R>;i znjQRY;z>2g{p9=O!@pF++;fqFC?{5x24Zg#8^+lCjL;oVB*@+_nnl^$xgor{q4BPU zYQ))_HtGc0+qGtp_I74O*Bimw`#jF$e#o@J)0TOx3b(gQijijU_Euh_fP0URyt`75 zByRyQB%Vgph`Bdy)Cjt_D$SzGtjrMX-jFmC&&0GpH{iW#!dC|pN<47D)Wcgod_)@T zy_HAbQTV!S27K@FQKAjRY9(!`5r6M-YA#o20pMGe7HUI8#~Z=mTl^D?i(MS3#aXn$ z;P9<(h?9n8&!cN{$h9+Jjht!ug~dei>||TCXku%BZTrA`gMh&UpS{u=_&$e(dlN3od*dZ=9M!a z%bSG^43m}7MF@I$%xCwXJpMWwkSUZq1I6UzC?ptN1x$+uqgGXfK$Wd? zSAJwG72SHVz^2AivWjG#z;kkx=FF%yVp6wY9MmQ2O)?{wQ{{#Yc;FNAzji|bC$C?> z(d)i;*{tx4@xV#CLnOD&y;R;Y@|7kf(*J!V#={}a`-;LtrUMrb$im>n{xJ!@# zIg=9vB^nYRm1uH;utY@`hl>Z?7RWxIin-Lj2jO$A?G4 zk*<|UNB(|m(%r5_Re<_4R0bh4JT||rRW*$Jvns(JYMi_TlAUgW6rgW=UuX*%c#t*hc}TR)GXPOy z+2&V3p5xPVEHr#={Q*134!QRw=#b?XHYL;;kYW3beEb>6y9^m(G$!RS0F!Z-3^O7K zT170FVOP9>5Dsje2{Z652bE~m75Qe?{}sqELNr5|u47f~V*ZXnT7MZ$zORPS;u2ve zsHQ@L(9&rQ1GGFo=;${RpJkQI!n3T*5JX9nc!$L`g0plJbz-xuN;A+bE3drUjR3Pe z4(D-BtefEVQ9o5hWmyG%P?pJR6qDt$k#}q2QsiwBHHD`IH3G796E)(oOr2Q(ipdM1 zu{1?9U@YDI+^|@>1y2R4A+dBVSs<3lqP;D?5t_kaxoi|`05Muc18M|exon!NlvyxX zrp_V_DDQM504&2iF}TP@fZB^km>53gMWF#-nJfWYSppppj1+4@7<{BVE2^Tb47YNbFd!?Fb@=>G!(G0}ZF;XHIVn~PNmOOWR3pqPBeq4VMO4=t zfmvn5vPiX%VwqvJFfc3Ak>`hdua@Bhg83*`2_~tc5H@LQT3<^9!*qtO97!ndEjv$MPlTt`%k z9QvhQPHr?1MamJ!B8NT=k!YB?;ZlATKvXh{n#o#uIuoIAoCU;;+DULsV% z>ZiAFt-XU^?Av$k-PN`CT5zG%>HVx$bix1Hw*9A zJQVuZ51!qR2BFJ(Zi5N`_lv5#Y+w0+aKTg;@;h7$(_faeUm)=DtYqNbl!xoZ^nS#tFn?0 zd^hsN>^NuK`L{Jy_${-qI@n_UhU@t#?Ry|Gd(A2a4X^VnzQQo}{8vZhDtg zyQ38SJ3L8HyvYSL8GgS}hgS64tmr%exS;qqTNhhzwcdu`Z%4@qwM7D+8XKRdGqo!8 zwAlGP#-Pl(Sb8%!GJ2NhkvNsW`hKT#qu+lGtgjBNCr~|1r=T1bu)as$yfTRx%b7&R zg;PAbzO1OOe?xSG&y)74(&(F|I4a=tlJimtJ3n45MEFaP0&6|QlzpXyr z6uFS=Z7R>3Jzzb@ayI3c*xNGCUU}@XWcj}K+}S73op$+tYM%Y_o4R~YwcqdiC~FAQjj%CmN?T~6q+AK+h*wkaC=kRX#?{#wD28NUgCA4R^vg_xC>|AU?9!-HyO zB-(-`;lc@QG1x6LKV4g=I~vP%fz^O9D=~=;+m-l?(9KTdm6csIYguCFhHNYhjdvSb zqiu<4qfX-zyVi_#iJckI^+xPVd>-dBT%&H8HVE`Zgw3UZX}P9v^u(q#jA$ zCf<;E8d0O2iD{!oLldh~zD07DB`Y&zYGO#5u{AO6&&}AxG~ug5HFFbF53gj7<6kR} zJ_oQ8H3Opb_$bi^VzrVs)M#_!acb^XXE8dlDlOE8h>ka6cVh8REG~9&pcdnSGZw27 zK45H5tUU3-ybSsvI4RKxK~za6YP3Je$ZfG&5!LxdY)~?SS*&IV!OWr?#ty~qO2dXI zSysxlBW#ah>hd;FHQJ(>HqXIQ^OkL-KzjuH**kyXyVJ|Jw)!#1$f)-7 z;gFW7FeA+w54k*kfLUTwV;xy&Ip9W-9;HCjq8Y`|4Zs(zmnm2Y`vUHFyZyo7HDr-5 z0m&OX;SDpGL%LG*6B%AulP_TN!o*#p+!XM|ApJ9jM@iZci0uKcj$P2)(@pyt znX&1C=9UR`SmX=X9|m~y2DL{!I2W{M$bsAn`2sdXVc4Fb@o{@5CkWg#BtCM_UGZ zgS~uIk;AbEF0%8M0b`WqhYtCxK#klQ0*E7*s1SW)lX{m0b>olhrfP>Fxs~UmkzAU1 zu{4KG%5prn!&18`v*_5VQvsIT3UYBv4oUOyr3^d4d$WjG!3^%!mQTr9aBM$%a641j}IV1w1vP3#2 z7>d)f65Ns9QBTk6#$MS?)#?K{^PwXSD9hF|{z8vi;+w-|;{yog5HZld2{LU9@-2Y!BqN()d=+k~9tJ zbOvdx*Ujs-JKf9^jL{Zc3)Teibh^t&9}4Gr9VmeUADkHmmkI7^_bPwZ#{OyUs870d zB`15AR@dHYy@i|C-nT2Qw{9VMz;5|I!;^H&N4e=Q>E@PQb`tGVJf$6SE^$%k!Z`%F zrH-#C%6v8+UDUu@BQwpCx3Wy z@9A$JKC6ZTJxOkgX(Ho!Q?@3uqabawc-*vGi-v{@S&$2$gTvh)k{3Ha4B6pqcCZ)W zM4izWhKtI^2sC>6X1k3M`NQzlNxMx0mdEC|NjII|&!+PR3xT9hlc&#q{cK7{n}ZlQ zX=Pptprwv)TQsYfl<1g?e)tGYAO;Tg_!ArE? z;7NMdG`TLap*-d62+o6z~%FGNQMiUJ=>6!N^p)G9=@YNoJW%yT{wgd)iljfpfZGvJ@tWBAV zjkO7iA+k1Q04ZyelmTXK+7NEmrYVKb+QjSZ1yjuQHjLJ$5vb6UFr3yVUMEy7?{|aM z@q!X}T9Uv^CKfDwB;j7NWNvejx;9T%$=Q8a3Rz(TOWl|XxJv~E4$<@|AHC~zq6Eb2 z&}wk4of?4jIwbsV@=MF@Kz^p>$1*!jh|9A4f^==2pF@z5{G0+{u-!P94giE@r}J>a z!rP@&5%$32B+}s}kiqW?e}&kZ{>RE2i1g6yp4;BPM1R+QN=pV|g?o?I&Yf-H5kO*W zQ9HdaS6b)r)c*tzeSSdVT_m=Cde&@WwQI{wDoa)I{#Mj95UvtCAH8v#8aq!lU0iWo zV@gl-o@>lf=C;#b&*o1(gT?JMr7VX_&IWsIhLg|eFXTFt3x;-vBp;dZ>mYoC{Epi@ zJQ$r!+LPgnBYe)igp0m|gXcT=pe(uU=6WhjW%PYagHXBF)W4y?Km)J;{3O{s9G)cO z!%2cLDkG%rB$Bv2Io^3WJU-buNYn-mQ<-q9X%8=+3mBaoJH>9Hy}e=blB%U}I#++Z zVPd!tix$>h%F=SWi5DZca{cXny^&J}IbFC)1=ih+;h$p+)5s)e*!yC*x#NrSto>oX zC+n2(cw`Yge*YPdb8>-Q%R3*<>s1Tc?VQx}rZB_c^<2Ky?QAAbhLh9dF^0fsKY8@{ zvwOgWk0(1LY}D{PoJ&kMWmB5%FzS(EN__{o8y=3m80Uik;F5VSeNz^C)^5QS@g%j{P-JF{~NiT3b#H2x0n14~E#nI~E2 zm=}3tkmj7KXivMOXzGZ75?N6pu&zw(rZ}YT_LK|WcUR6}Q$U)RuC1(|x%1Pjq{(cuH!C`&VDE7E z^aUo*9Xdft)^9&Y)(&D+pPU{Ik9n(kxSu>f9`5{rd3KNI?9upi$V>1^#&pNDU`%#& zTEnI~9v^hK9ciLtmCTyvSeYT)6HVelD{C~x(M{B8f@4*hF}<aLCwX|ftMp>f&BgN3*hd8@jn@U);tQyJYvjV3atPToy9i>Ap7 znZ#&{W=vsp^K&zS(Jgo?P|f5;*P=8a&CvilEWwVq850-7A+b@c0Yp(n18Ov7aoIG0 z4%(2W!ZDZp?B$)5`s~FgvD{=rzQ)iI|ly|xjQx(HJF}TP@fZB@(4H`a4$XEl6 zDT>JwM~O?I1A>uaEf6$S^q@vl6JKVF)P$IhH)2ZS3uTeoAcQi5J{VIGs~Z9lzYGc? zI4RKxK~zO0YBUAOh;5-d5!3ZXOg%DUS*TVBvCN%}mfmR4cij_jpRMCkV z?KFIuEm9?7I^KvChA)&wDufWq4EkVfEKD~hJICMQn0E;jLUK~95t68iO4MjckrCS> zbt0wr zb_AT5s_Pf3GbJZ+41%zVr*u`4Nu)+Hi4@N=lbG8&QTdd(W;KcNpi%u2#N~_}7<>Uq z|9I|AUxP(ykjZnU32wq@4E>F`H=QR~)Eh+@I7J{)OXF>BauvO|#IIrnERu zatZ0g)lE?-N>h%mw8OYZO(y_jk)TH)a~`vez(CG~YlI1)1<8gEm4)E`!V1AnzX1cf z>xJO{Le*O_1h?*%Skx@Qph42Pa1c`>?lYC;u3&-=Y!HBh>7ar#n6`{K0JIbN6_@)L zXH(Pd5RRj(pdJ?t)Z=Xp^^hbA>hYlk_4tK`dZ>!tV60y6=E@ri4)W>B>Kk{?6B>ke zDzvX*#E0D1aKa{|L4HGTNYT&+MuSukMw@pbCATYPHlUGQ5h}tsjWUGC(`N!dDO|M* zXomqlZI7QR|Evk{bO&(SssVW8ofku{{lkwFXx7Q-`N69MFZ*MOpaLoc6ng?rw><{V z4_f*X*t|W!_3mB!?iw7xCLf9x_YV(I%V?4u508$ACqST_Bp*^DNQnbEJ1`5V>V)0K z%0wVi$ce0|s0~Pw7^6Ivf$A8JcMlFv2yAq4czE>76L_!P{ocZM`BAJbsTtIYNo*Ll z;xj^L2a&iHyJ!};V&{e+9EQfbw677mV%n$^yJFXx0k7DZ5nXQtzT)#ZkMjo82G8H- zu_}VaE-6Nufv{M4v>aoCYvu;u<0J13&Lhd&FB%e0BWi@Pm^Ny}u~?O6uko!+dPgN4 zPk_!y33l(U&G_K%bn!oy$Bs7Nq(r@FTju~Bfu4Mu)=NdhJ0?Y=O!1CRC;s3h78k1y z)MEUhv?Wb>nQ!1MRvv9vmq8ndj}mPll9EAzj}6O(U5$_yPh#e%ZWc_7RcWC%M0C6n zSc}C!vA9@mpcZG*1_N!ex*R=m!v*U{RQDT!yJSVPU=0zXnMFkm z7fpd-945?Yr_-F7(J)rsyeve*VN9{9@i4h3QglSs=gXRN z>hOt^ki409_@tdQS`6h*rAU13@>48fQcXRdpLd?zyZvP~Z=Y}*Dz1rxvENlwaDj68 zm-ZnphK||KCED?m=&mZ6$%~+3C)(ksyvNFV{ImvBz}2Tk5%%$^>YtaBPx;CU-Fqg_ zZa?|_-n9NbyD|PftFYlX0LfEcOmF{)K0R56vw8DW!#^BIzKS;1rHNuaVThjbqhM)| zGbI@}7{VDYeBf$Vp8ej|;6{$qiN;}-UA-{jDusMB6WTFN)oMkFjle3E)6coP@-%Pr zH7v8+!No_K`hnwn0^1^xy~6*DaAfovmU(=-J7L(GKa8+rE5cl z+mm!02yasS4Y`F_2!Ft;+#wf~fFf?EgYG{Oc949&VW!?^KVX;fxhZgi>~?|j*zH2^ z-za0S%V0w+?M|T^xrGRWC|tY4&pQe-vTy`=9r?i%!rD0*?Y0m1_i;Xx_$~)c|HN_% z-%*E0$@;noNPt03;JF@R12Eyb3k|gj$E)l*Gi5m!{MYR<`TNSENHkak;@*-w90klg zBY>Izzz9!rT}b}7s)0OJDGLOdi}NH@<>?7NpyB=N=wJjWr-h~DLwf>veyp7889eB< z?ePORc7!KTd|?CkX&O8l?vh_d@)0UvnmPDRDo9O}>dMLe=Jwe3`Y2GR380TeHyV$J z$1e`yqtapzP|u7zGR20FmH~G<=?&vMb9kZC@kofLS2~OG^aw&|M~BS2c&ZWW=`>R( z+|#Q#gZT9Fu@7pT5zKAj?YLWmJ|bZ&&G1 zd0JB=9@J^3Mo6ezZ}!U8&8N3kE`&y~p;<5VQI}^DKJGIOPSnk&UGb7=46#zK zF+^29Slk=j8Zo0;>6tsNSzx1Xy=58`Cxk}uqi#ot(Izy8+Kop$xI9aZF<4SJTYOwD ziOvXS%C$z&Rn?msaiw`OY(jHl1egJkfeQjvoq7=Us{w;JhXpC5CKO1FmKpWO;8xvk$xDVMQ6R}pxds*7 zL^=KQRH#M_tJ93~wb8^f6fKHI@T|FFYC? zQJfv*>Q>JSOC-+KDY+z2SC^;U*%yhg(XL|cle+7nUGF}A^z6Z--`;x-cxCL3JEQ`b zSC^EImrjVx?;u5_m7BwRg(ONfxxj&o5(Id>GS^Fm((VP6Abdx(HMRzNWFiPzgQ&qcxPb4C*Ob46HKr$hl9 z)}ad{VjVIc6zgOLaj_1S4~=y)gXma?DhrTxvI{V>4qXmR*2z~#!sWL-8L+HdPwXjO z)~~5sPlXTkpnp@RMva|yQ)z(xt-)vA9)uCJE?o}HM3|km_m78wxn)o&@)cw=#5>NW zTYy@pX*o!<1?Z+Vo2rntZXGj#Yn_V1_*#eT?-OF{bg=|wt7tu-tx9I}Vu1@|hYn}a zK*-0#ZMBDZ>~J~?Zrde?s%fD^RY_9fP*qYDI8^Pbia5A>r}t~bx@I6Wu+_hTXV(2Y z7s%}@xl(19tJX%069#O_yGNG1iiTap%dQ|X-|gzj?(yhoB1FrlHD-DuJ$Zg`xcfse zx1w8C3RF+wbp;GnOoDl_cU{k{s#LN!+&$Pi<^a9G***gR_K(p2ofjt`+8$aDMkhxJ z{+T3jk4mmkPsr)&4m_W-UsOPBha-Szj{)928NE0<7;caMNIf+m-j4}i3-In}@*%l= zMGZV%pAs6py#sfz-;F6!aKeobC&Oa^fn_B-$HzObxO*Q`C0z00^FIw?cSEgzm_g>M z&IyqiWUiCmFfuoX7drWmMCN*>v&dYJAOuNu$h`Z48j-n9Gj$?!y^1r)TrWRP42>Xj zb2y#HO@Y%4FWOE@Rb;ML*hl8N*^MG|v#jJ@v}LLCcG3=&r!_SqbDd^tMCQ8nX0NH; z{17tNp~4qZ1DDhe3oM`}RHhm-*X5an?;vyCY}#03>(Go#<18!X8bb_M)tDNQxmlLY zMcgdNT({mbjfoRNBgkC0BgAME8bj^ILpofZrN$U!uA41ji%X(2f|+uy2?J7{&Uq_M zjmTW58TpytgyzHwq7h_no{*Z*9wDR|^~WG{y>1D>;<6}^;3h(Y!f;flf1V1}h|G1G zQOB^2=uoUE8bRjfim4GT5@MQBjSMo^?br$29}Jge>n4~fS0X`Ib^BH$GB;0#O{h?; zAR0mD<_W0@1rkDLcyo9u*B)lMs`Au`$<1N93EhblLnCmPUIFL**)DXshbcbsVC=JIJ>*tYqAv7e}K5UV`ms?YY1 zmj`Y2ga|#qm*)O6c`;Y@iQ3Cf5)^g5ZM@3my4I8Hji10NhUODMN!2cHb?A13q66;d7f#czK!@nLajb29NJj+;<4yZu>}%|x1Y`}lI_n88g;vwj(d$`#GfmJcXT&E^JgFg!J(WTy3U zi6q_Tu?~jcCKSxHKC5~emt?Mb0d;zUnC(llj7e_F6-yG9k0DR1<_3X~3^k!r(XvRo zxXf>O$&$=Ap-k!(bw8N}`$;m)-4#xTFOJ&d(-+SH&Rr69vRNwEDVw^oV$BUBVRO}l zcG>NhOC{;zzQ17=vpH@;&+PVRUA98#iG8+iSrRo9%#f4fo6r_|Ei-CM2(mC94);#lJ8%~BlHI*5%N{MmSGgu-id5FCx#1WxtTmx! z879i*lcdd~8ZvA*p@A7DX4S_K#$j~Q{%(j^qdOD${aKPbBZsGQJ#@&+$C!JAl+F$H z;IP$%{y7Yk%Oy#hM?g3%H=%b90}O>A#UtlkaEf(2MA%=7!r8e>f2FI(tcixS;2?SC z?iiP5!-)MN1!It&%9$;SB>L$m$p*Y*d^h=?yNj5O{j1mzTuvs?ow*n|+1tQcVimZb zk!<0lVilx)1pA)I18f9S-8mTToFpIWQ1MPt+McTLtg93leQQ1WJ;Jaa9=&Rx4F7zJ z=*+|Tvv7*=+GlTm98cYFIuWtTGvh0Nn#O>fZ?FRJHTXG&YTvwl z>wWwgtWwDL!7nLk>-Mcn+lbRHk|>~i+P!^i?F0NxS3kwC1iyOx>tFDz&%fZ+x0i16 z&&#W8KWqIA)%D;QvA@##*)3!ZsQ%swo^Ic!P`DR~ApJj7`4*KD82a)aH*xooKp;cJi_;TvgXSbi- z`}Ms?&;IbM$4`EZiuwA1ORTR`JM1Mfxyk22H}REw6MOd!!PiaV_$IM@Q#5o_FwIru zm%O=iaB%pS_91yuZ2vHPb%G}RBo2T+JU+&LVg1YDtG^r`?x@~m`^83faLN`julOBL4=8B_5K!@Z^`;2$awE?mt{WO!&n_}?2nVX58Geg zfBf)Xas|Ts^XcJam|Q{eWaHU4U)^Iew94=>gsxRd)Ujjx|>naBQ%T2T)ISBmhDh}3<`JT zVC9%+3<^w7gR7YOx_wNqG#_IorL;b!4UmQjxr=#{(*BL+%ns7l@VCn|ZrRklx^}sR zC5a~FG+k+3zJ-#TJR!frlbn!=ASK7NDHa1YA$L1S=xp(XYzPoupx2>l^o0DJ=VP9z zF@X2aszOvS^FL4AqEb}UYrWsP)LPRswkmq%ZFk~?I z4I+ornM7n{6Up^-hLZhI`*jkPPl-qkIf+pIEM*>_{X9PVd3^Ts`0VHL+0Wy1Gmp>B zJU%fq_BO%mX3vr*CxWd_5;AWecTZ0yhcDpGZZw`)&H>6kAJwrqD;WJVzM5dW-0AU0 z$mXB^Y4vkF^}j(Y^nl-+_s`Juj3+#xznCnYxEUBm`nlV+O7uU*eBC9f_wa$k5l6ax zFX%>hGgSC9Rd}EaZ+V5&V9VH(i>A}ADxIc&>0YSmi7MRJg*W}egHU1glvhghJKa*{ zdmXPlz9Rxc+fMtcd@t4Idw%(Txcrtbzp2X?1v_zH8rW9l`yExj-}Tz>r@{7no4UMy z?|uKhLz@Eq|DXS#cyoRI-uwQ0hb{#Qzb^}K>es&MzxK`GYwxSV`n7NRuYEK4+8?UI z`kfE_cRmQd^F3L3pkMgFf8m4R3;(~WuzuSE|7{N}mG$0snyPMZ>9@V*zwNE?+fFxi zdHuGx{I|UoeA_hFNdC9<3*Yiyc-raSS_!@K?OwklY5>{o6**$@`_76xW|4Hapq8zH zuH`eUmV4P+eif|ceN2&<@X*rdRu%WNRXhk*aZ^|Eg;m9u*(x3etN5L+;@4IckFr%f zHdTP-uU6E`LMM@>>j)7f&e0bwMZ3xR<)<5&lcj>7N6xoRIOvf><_A4;GJ`>n94bHP zk&_t=dgM@LgC05A1woG-x}2a#PQLQC8FA3QiQpydxDN8pyn}YU-#=7CUc7Q^iS~eo zN>o4cYtp$9xPjz4s*^5Ta@kVuTq2}&gQO(fv*cE#JXu6k)$O1zJ|7ZpAad)o@?(11 z?V?U?gPdEV&W)-sMSa2yGq>7+!FYCPqd6z?TP#F*VV!r-R2_e)vQ(rWP9U2S>Se;6O8?hLpzn zaefW4m>1OGUq0t@$(Y&R>klvSEPa&e#?IByTfmQ!*HIn_JzW6L=O+IDxcFSzXs zAcq9Xkr^0m=v+3Dl{uR%=Zb6wPe$2fK0eGz<`S1t|N3_YH5I%1E#Y)Q4a zW^>dEp3PA&jLg)ac6se zyM)i}wAZm%m5*Fa+VvRbOewNLo?91gbL+%Uf3)KCVLKgc%5HeaPQ?Pn7cB9kWGWwt zQCv0qj1p}zqrU)abid58bqb**$;)IHm$1)wc7G6o?p~6n;dou1@@GeQg&mL{`_Kcr z+SJb&-nhhF$A#|R;ZWS_;y!kSw4FpMPJ42^^Ky86vU8w6A+Yhx`=*i8W5gDwi>*|) zLlw4A3|*CXr+bGKEwIhAXPdw{SAV==5FgY`j!M(f>o^&auD(NBaR$1Hmn?M^YD3tK zE};hgfWKX+$s72azEAgUAmb5ozx6XZjO||`QaX_qhbEMVLzDH7s6_vM>*q{#T@s~Y z7C>Iwz3))mR}|vli70w5#qSh_I20p_O_$<(MIl%r3b2Apxlh)vtbMq)v37OsqqSeO zJ|ed1|CQD+kc*qRLHD0%9%x}UAl=4oAPx9kO2dyH($N=rtp{ucXS6mxU;DVVvDOB~ z=Gry}`q4+P5#ZTfcmE@t4TM zu?-GhKc?d(k$DA)bdy2)*6&KT`f2OK)n|e!>Id!*bU&{A8%p4vYz{<;YyS(+q=}tdG!#YO1Iq?ab2-+T7#-jhE(L&U4jU+&&ls|!zk)jF=*|LlFQ;|h=)~y#AW^rgf4KL%ub$j{`V>f-WL<44 z@TGwNjLPmH3h4Reykm7S5ZZOFm_|+d@zO^+-o(w0a$3PIt zV5y=eNGN&q__KQmH7cTts%+k1e8?e7sh0>_x`R3S)r-T^lWPtD!DXDx?`aCdc#`{# z)Y)%fz3S+rb6gvdHe7}(bOyB2E7}hz#V4hikk>5KZSDKr_Gy^2;ObkTNC8+H?CtQ| zq^GWkuU`kQ;VMn*(!VabV z7>Pot{$VbSJJIQ!acahI_M?^t0E^@BXfk>+!i42`qi>JK2Uy12sGq=}&dURii;kHImdRjIQlP}fO zJfidJx(k+cO+#-pPAG66)1U_#hv6nwj084?WtZlkUJ5iU$GA(A(8<^mX&A8+r(r}H zH<%y+%Q$Bq23?LcvAKpo$tuL&FpC2Mf5$BMc0?cAFzdQwG%Q{y%|`asog#*t)G%tl z1`W$G<*W+$|oF&pa!BCvi z3EF9NZXO{q%&^q{7LON5`k6bn)&1bRXo08wBcm2+$dY1 zhzQr>D6j2DuaNy{O7=VW=uUCdl5VyxQaNGIf91@_@{MOK_=Wnq_SK##KbbR=c|Fc& z*w~(KNhXIs49D%~!|#wmpOu^e7~oAg9b~NTMS8}79wlnEspn>5Ean9vAc6;nfRbcU zdU~KJ1mK4l9M+|&zL?a645cC=kv!;*8G)>u&QJ9^QMD z{QK>Pzr8n|h51%5ae4ajkI9VQvzd=+-not~5G*FHdD?`-!u#Cn+WFRbjQk#q>sseY z-}tI> z1khMJtvuR~hENw8Fvd|uohmi04YX3HVhd-j0!*G`$9zNGQQz3Sek1RWI$gc<69~O` z_ouW}@d|~@YI+Uo!dfO0&PHEYD@tLo=~L2uvu)qo(o~u;yG^ByYnobh(#)Er zq(HsaCDB@LCtPmB335bCWDt( zwOhkdYUkPZ8X8MvT|zPRHP>20Gaq5Gp=t9a9=6<21?5W#6c+;^keRgw(3R4DG*Ak= z)%+a2S1GUyPz`VuEWv!+07VyJAD~DD?l{s$pafKZ-2$r9Z|v}VEIpx)+4dj+q%Xy% zE55}_S_Px7OIFlJdTr|6(7sVW1G6?AR{dKXB9~#p6}JW#4#D-T^M(Fd5+y?o)ymdU zrt!rPe^s>*;m8cCHo;r-@sqktHQ@m?83~izB1B|IAtEmrMC98F5!sO>Vu#b|;p1H+ zB7fl`B57C2u0`Y)4tRNdkT4?hQ<55OFgXc-^?tG@L?j_`_lC5qBe-fTq7kJ=JI@b> z2^EERy~*fs41glu$Hu?ke)4g0_wl2r&j_jb@ZPhl66MGZJO|i!57rW+{e8>{d&8sQ zc#p8*C=PdePIWZXTuYK)p%&DM%C^U%TC2^IkGYtvRZZqp6FB@On|vj3?ndtSWL02j z8vu6AwX8ufH~eli1~_NJmEwzi#QlPgKB{qlbd3J(em^?c%YZIjDH_0~lio1cGKUws z7Kj8|dZn`s84^(ZJ+{kp1`O$D(RK~1e$9}bVe`}vCi3hy^`=HJW1b9~(3~)U z(cusWaSfn492VrcVH4U@6|m^?Ems@^R&=wa7mH<4AaRx!p+VtOSEqm8X01kWqSK6W ztk#GQ#fqX4Fk-Hl8qp#lrWuzZ13q*+#=c{gM2VP}aus5-s%ubW~2gvV&WB5*Af6`6Bi=)xO z&^tWIy{d7}a|}yOD3fWuTp-l-g(G!CgRcp-GQ#3RU{bJBl&;Ia+}lBr5~1s6H;B&l z8Hq#YUauXQ>+@lh0v9{8qjKHq`J6x@a<3O7a-EV(g2r`u%AJpqICms2U9%C&_R{Lw zTdlX~UijOU)?2rbETV0Fh9`*0APir76{+QG#to3F2x` zpmOnd(88r+sv>P&*&eqgI46V6<@L~LuLsM;ZCNxbmutFds>%kV@+mT~+`5svUV|~1 zT~{73boRiz?zmD=5D&QP67i0J4qEBxi0;wpf3F=v@45hKH9CRig%?*BH;e1v$N*IQ z0z**VFCTpNH2Lfv!dOuZs_8Jj*Sj&8-YRV5V|!hZV(ObSuJ=4tRD{jDu)6kUi*WJ1 z-Idmxq`Cr7{{^0;>N0AcoE#cR{Wo}$0AG{Keu$_Jt-3u{T~=wlR14sHzIEZss;#vI zzM#u%jhd;5@bz>dCsv$K5v88fqJF)`pqjb(U-z}UN|OTuhU0M&%xJT-)$P7U0kh9Q zf-uh*%!pCIz?Jm;;5#C=VCAcWYV z^5MfyW)M2;P-S7mPIdug*rCgT3p@GhkT~Mgm?99+#4S<6ZZ$lkM^plEFeAG7UF6ne zHl7jHArb*r9Jq?aRU8eO$?@s#ghQ4(>}i~_n`%nTjxiaJXV4d1EBdXebT}Eb*J|qD{rvh?sMDwmnd=V zpJ@uekDX-i(b`YWw(tl%C$@{7-j^$_pWsP&80QBh!piI?t$#jiHk4nAeJ3`lR95>K z7d2@g<8R!i#>n!le{tm_ZbQtnzISZZL(4HHULsw9=ec~gJ!d;;TDO{brKc|?ex;dr zH!T9$^5|UvMppb9400vk)c3dd+0!&Rb%l>=yfg+X!v}PC^S*e`Z|&j@bk4Tk{w=-R z9uW@kD}A_fw)GCDF;12ZO{xM_ zrvq-Xb?NrSORW!{UHpI;da-itM^r0*mpOMf6I_nE5)5)ONkVR)3x<`RLt_9eSOM^o zv8t>KXfJ-ipDKA(9qw_MA*ziBOYUk@Z3uVG48urscAreHjH&hVH%K^36dR_T1Gwnb2cQPyN0j-h6#wr)nkfopLd zNb7-BaV}Kb%8wI6V^D36(|O$&>1KFZ^F&A@s&);ltILOKo9xD++Ab@ht5=sQ^wFZJ zJguo2s;!%;8LDmS%?F;E{358frosnuLl>=@1r|^fDpMV*ZFrWKtHy7wtBthJSdtZr zSSi;SqN=JfHTtQ|O3&QI&I;9bUz%%_m~FRQ2#rCtO-JZ$HK8%o?u=`U3)MDVS^}uH z&rG@26eE;%ecnn_GgMnQBab4R(41I7GzQi7h17)hOas+6e9INbg=(AZWq@jDxQWo9 zVtlf$(Nm$Cq1w6`bqe2z4#kS1F{pM%OpR#KG*E5Bxl|(;s%^44QrVL1+?bbg6$%Dd zb2c}g0@V!F_5|33`b3JMF{rjDq9#;_MKt67&4p^4PSLN?&H)GOS`z)SSt?f}o4WiX zz%{mq`XHAm7r1S*8wPIMj5G<{w)rrsfg9R- zfZL{edL7!SUIcJkms}#?w&5vvZbss3;5M(0Bq+6vML@St+PkO6Cx^$tS@Ss?U9Xcv zWv=U{U0D{qou!Gwhf)*MVnj1d#sIi|x#UB*%?MNQnj8qXA>w;NAHtn!X+a=v^A^b; zGrRqL@aVy_2e%(S_>X%}ri5`vxn}lY+$D^Jf!s#0mbclY}B^hQqT;n!}R2}p#E1W?|&Zk@@cbH)L5-GFZWQeOkQ;mZ*? zDB!I$2AhEC07mKOZkH~JBznC+A+Q#ORnS4gQv?au#9a6v2+-|~B<%Iv?Q9m%txEu@ z74i@594-|Dx~=LEM1kgH3jwAx3jy7lDi6@DGYbLTnkpaAt+Pu2-I^`{=+^n_D7pMB zAt69FP2IU-;W<5`5(0En<8t?!TbGp|aod{|gSvH39Z4vpXCOHC zE}hmn-o>zCEBQa){DOeuU7b&(28ImE%lQbC|K4ysVdZ?jb28d(AMWqt2sFvFK+p;( z1_M3D1H?_?_%Xrp3>-N#{IkjnG}DfNd?%mCWitWrTfSWvyNwOJ@M=z4a~blbAT1s8 z4&E*D4z5VVmNDcVTv4%xc6v8g-rxoR-2ZfC^^H5{5!;KtAZQ~hEEW_4l(5MT#D7Cm zhN7YPGXqJ3L;?EuV{W?=`i*yz4VQ;9sio?;j0pv#e8h6X@ zoScll8^54YNPGvU8G*Cgg(r zc(^;kdp$;75?Oxm{R!NB6R>;)7qmdD9Ut$!f?xB=@ObBd+?gLf{}UBbDOBOdAlzdI z;nr-iJw^rOG~DorM>rN&fOXTUVb+_t$#f-V!0G{thGFZ4T+!`VB!E3wPZr7^Bn_dt z0|mUR>l)$hfd=aYx(A!cK;DCtRmIf^48D;2dECSW8st?XkSE_OTq)7CQ0`ADSdAF# zUF}&ZL`VnRn1Y)zR4HOA?>fAQK5v5+p!c-3Mp%8I!5RVfp%!?dbqwV~l=Q}{2&)nJ zeG&7^qN*gwc&JLKNAfD&!1P0e^qstPn#xy-Sekt=>qVWYGWc8&OO0^;A_mP}{Vc%# zPz&*zO2VxotVUq}p>7iM%c7~oOKqBJ%mYGQZ`e?vn5|0dYS7Pnpbc+jtifKyUkZRMd*%V zKJrbzLK4OV`uA=8MHtD}h1U5iXNn_vD51s~fcZ+3WB-*QiPGe0&AH;(EaOaKHQ73`|*k%^26CN9ayOrRi=OC})pt!+`kh_5DPE zK6?cEWDn1~rzexc7q}-HjVJB>)A8;E@Jar}v)t(iUb%pE$_*5K6>>R0>_^`V`$5mx zYMHPfNWk;!updGQe@|gQToXAmj>DTKaB{z+EF1b=&q}VJ8mqa!@zE2|uhS;Yk9WiSHa-n=hSdUo~4 z8?NmkUIdx;3Hw9!+4px7HwGbo_Nv5;A#*zz>Wz1fUnPe}u-Ka%9~t7O(f&dLlKd1(?4iBzK%oNl5{yEm)SjHR2ESKjSLtl2yc=W%VR zo8YaKeyVDtW)<|U(o9yPc4#gedDsA#B5z&R6rL8;XkDh8sL`Ix)X8^_js=;?3)zfm zie`ee=;m1UEx=)@;)M#a-n@~3Z3)P93 zt~U}CB_o!FYDHBWAj7R(CXCgOl?9JL>_uo9wo4PuOtEqpx++_z8jX4K?Kb)3)K}Z zoEdb*n68-a?C%_$ERV8S+!SkzMOZ~$YP3tq72zWFC0YcHSexXEXOS9XiDw3tF*YQo zLx1Ljw zPbbz|#;sG&UHjCos#EoSyY6lzmtdLSACAU@hb3LNA1D*r`S2#AsFf*#4*j-rP&F{F^qn_-0qF1o?e7{DBjPe@df6dBw9m)v(48B8Ad@r|A5)3Mfk@eHO+?bvJtc;g`SX8T{0jEm{T8FcDjx8+ zB4qyjpYU+P#uQ38VPhILrqAYF)ojj=W^;CZHs@+y{(nX{V=Aa10iXwVdtT<%mdU)@ zmWyQi+{y!SoBL<<-P!!< zOdfC~6JF*AWr)Rpi5xeOoxcx)?Bb)UBs-S6%UBEGV;^`r^mU7cuRDh(WttF^a{7A@ z^_#;Nj(#!t+o%u^tPA{#Pa&Ix8B5UAw?1NQn^U_;nOCyCaQ?~%JdpCqW?cI<9(xfh&vxHnp9iLB;)JgtMnUN*8 zAO3(F4%O9%^f$hpUU`=u{vf`O@Zq(&L(70W;+qJ2HpsaK;vDhjoEsYvkjhMHTTO<1 zdoVt*+U*ZTDVXo>eI!chP?1>ZrE6=JJo1qvR(qaQ9EpN>4Vf*Nx|h$teNVqqF+oPq zEv+0H4plO8t#Ow-4q~Mxj5fOxVK5uGHe*?GNmiVS=3d&UCGp6XYc|;uU)F+b*=|X) zWn1)__6Ld&nQ~X^+&M#E>)l_X>$K_fV3oU$=w^5D%)Nv@3);QxoHu38RQS`NoGBb? zSUJ-)JLdzHQ>@)MCl+s<6aBk{g^9}#gDW1jZbTZsC;yHa*L&M~+A5pu zY1MEu%s)|Y>HgG+n7hNB-5<-Cm`|~C>EmidTnh>sChcnPfWXLEtxFIO=%&Wu*4`m_ zvbcy*U*$M@g&lC*+?ag#-=AGJH!6Zk^RlnWobr-JQMkCJark_&kJ}lylb!w1OL5zy zxa9HqXm4BGz^JI8*L*Ih)ht5>HGws=L485!Bsh`|YG)1kpmuB?Gt#8-;NBH7LQNf2 zQbO%g15T(N8PW7wSfRd*$8mma>fkxtJWfgswR8H+P%Dm>wD@AFhZyI{k%g%6l4LCy zOcKu`DrAS6I(R3+oHb*!q?O9c!i9qeX8x;%C${qB44$!BVin3~%nm=)illc`((qdD z5%ffytvQfV;sHjMs1i?MSfW-Oee%tNHIN)7){wU=Wm@A|LxoIHQwO^-o2@lOG`tqJ zsHc?KS_3I%8f!3&QL7nZQ)C|OK}b?!5&2uKrcItrRLB}NbyP|lwTdmCBXVyOG$qt? zAD*dSDrUBpA$r9$wqe+#c2mT@{9G7^5T(pI@(&VBvpn;tkU?tdsFp%%m0N5dQO&P~ zMQSxc?oH3wLWF9jF%iQgwHh;eRWD#W6s5#Oq`)OhZJ<|Ips^iVDE^pKNFoj8o$bOZ zuKBf4NJG`k)>7zA66kGDKQI?Xd=6)kRBT7ZMKFH)%aS7p@Cv%YZ|iaMBg!H zi7Pj#3?0PT0S7aA9C(Lp-n<9~-IiI1n)bPaDwP=YA! zU+4*VL*V00tiZ>k42_TPTKIU$^J#!&l(rSW=REN7{~}*~!0nN%JD$xfPEV6?@U+cb z&gPLNfSH43)JE3ATh4I#J^|Kt3jg^8=hDn*U zQ%Rfy`WIG0WE!Eq+$+F@teoV!>_-(^Z01Im|i!Z7BgY} z*_0Pcl^FISI4?h=(XO|Cix?_k*rD&Qy@Q~3dvo~Z`YrJ8+91(U=tmUVS-%Bjlpwl% zgg*q&7HL-1^NU02M zy*;*GoSUWHQv#F47JsI3wsG##snBi-PNaEHn$Ds+I`=d-S#7|~aiNZ<=`AYpF&XSp zi7FXl<*`w$4#AC(R#R}(*IFyR-aVn4C~n8R-}Gf(a14utI4WZ4BZws8nHD^9^}_*p zKB1EcC7jSn45OpyaxcFdV)b~SDIK&lb{QQeIgo%1HX~-l?y#N6F_8vulPI6lVbb`d z4il5h>M%+C>$prz?hRZfNqFg&iIay}CExu?7g}(r9d-$kXA&qvObilSX%!(Sj4~;R z*g>;ISOCu*W!VXu$@5E?Urak?1>|3LW!j>t6jl&*HULPs#?9%u6hc*4#!{2{{lUOTf(e~_8TdtdVX}94p%wwc z)GxcUmz35_UJ$L}y&%>bg(<|j{@b#2&J?mBj0E{K2$SZ72a&^r$fFw=)kX6StSpg( zgMQt>!O~J&KLeON93;yhAHdTAK*d9Hc`(@7MOZ(PeWeL#^6SC=L4Pk%SDs?p5Fm0( zlE`63@&(+hc-9tg|D3*s@X zUoy8FH}KQG-MC3#Ew>xL#!u&VKdZMJpW|okcH`gigM9cn>LA}bIT^X# zxQ!p=`vO16_a%OiZv#Kb_Z$2mAK1Sg2l;-BALRQTevt1jevt3?_(8sV z_(8t=_(8r0_(6t0;0GBVZgy5t$|L+B@G*W6_ziwg${+EAQvQS=l=5f%pp;3{!5|LBj;=^uws(C7Tf|K|b_^a=j`3jaRFzkkKQ z|BHX0$$}^!{rhkF-+$2mF46z~O_a>Ve*QWCd`jU>`rjw?zhBY+KF0sZzF!@VspV43 zckhe0a{nO*tl#^Rf4{!>1^<4zA%1Uv{aB{JUw<}#s`MLw;N zp1zWCkM3~jL;3rS`eXe|QT3y5ZgYa)e{+|Azx?`-;`zRazjt4h2SL=I%ALx+jjuTA zqdQWbM|Y$|>yI9N{gr5``15b3MJ7Ns%!H`+$&kBJX!)o`=hFXXnj)T6i)3omF!`w3 zCm&TaRV-R7JG|(kaz~AB<7_6clNXq9ujAe_z;ZDY4-nCxCjmT4<}%|SZz zh^mmz?e-mV>x3(VPxHf;=$MxH|^oK$I}ZsNsHX{v=>j&n{RdAT{uP44)vw; z3yY_2zXgwADv9_KZgtQvhbqyhI6E5Ne%ngL{hIpZX_e;lg~iji-$4?(>W@4qh`Sn< z02Hu#k9yl5s8^~qa5B=SOW);2l;}XdBL%g=S9qQ=(5 zw=#;DRaYlPOoH$d5=sb*&9M>@w4qdcPv?`sf}T$CMK2#VY$1RvC`TPL>-|CgbBj(x?(TWnwslIJe^#WN-3em^@(~(Frf@s?vUwT!8VUWHFCOkze0CVIQ$x zc<928YrsAd9W9r7B%&FcsMJm175ZnZT@-&Dyd!gG553D{CLmq!9LqsG&NisyF z|CB_eHKq~%!6PF58_V(=YPB824**N?PwBI}1~cvUB#4W= zqPN-x?}DdQKx72wMJEMpmJv3aX^Lw|b`&^fGwrkpPqTCTT_9w1>N6^Fm%OS=L=G^e z9i%;T`z+&a03n6MxMu|DRVgh8ba+Lwnf8bzObrvE`0dJMXr%&>9*jpXC7ewmi}{q@ zy2e4Bzca$3J2)nXqU_Jqf5-qTYxtI@HRGRj*Rk_S}53}eJHC?mlqXc6s7w9@)u4X>zC-B9S)PRj4f4v_EN4su9V z;uVXdRyz^(aQm4I#eS}aSj9yOhyJ43;>{lJ51Q%%(*Brmp34shul5HAK<5JdG<;)S z0uZ|QH%|O&+jw}mi3Q7g1&uxKC&ZKy^9MxDGNXw-?$8%M1~ z-U&p7;8Cj*31rk4XHNqlb&3t#`#Z5Q&94Pa8c2B@+p|_BzGY4dEVYW_sonvX+L1J{ z)OJSU3zBt8;it)(&a5<^byNs8wJNF5)4yFRe{49e{_WVjwUU(vl=k?IT>A3E2cBR@ zsE;HH=<&DIdD<9JY4C;Eri)H#b%{W;yGwJDB>*dC)}}#T zHGA;q`K+x(C}%1=F<@8cU5g!q`7jhAOR1&gZ*o{I^QMvt!LL>&)!qhR7hF7>$nW#A z(V`YGtlbJJ=gh4|^pL5{#eie&2FbmWxiA+gOPRS8Z0lJq^US3}u&h-{Q_3>ysU=bc zwSZ?c)H7>yQE#RF+0l2444Bq#5brh4g|VbS(`~z z^J@Xy2CA90iHP?xje!{Ot=$;0JwF!~B19=Ok^J)-t683nR0zhkDrpK)W^E*K3aAB~ z8!BhkW+MAgG*H);SZ;Kgiv#S)8Ueem7Xtxouoz}?}QHgm!Blk z0p-hAyKoH%gR!4IH!tk=^x~~!zd*p&B?i9;=Nt_l77+-*Y1;y83aBr(myJg>l@hUY z>`pU)*9j!}EMW$nK!VRwphC5hNPrGzq@)NxJ0p67z^vLC(Ho@95~-s^vgKq%ub-V9 z^b@MLqtMJGJOy^4)2_n)QeYQZ1%Ov7xw}f>-L)w2u1XpO-sRd*qd?`V+9)8Eh+Km2 z3Wza>B1WGfz(1^X=^BB^wfdw0FZ!t5NY8h2dB-p@`rire7ASEIr3K{zZ%f_`ae}** zxZ|$&M%slpQmrhuJ-9VhIOHPSZP0zu^@?swu+kUcZ>>}UAyj&5(I#Z<2wp(hzo(r) z4qt-onCvpL(-c@*J8o!laJf$Xx!7DQ6&&zT5qt)bAw=}q4GIy9^Nd2GceGg-`sxHr zO0mUQsty101iOUTt&n6H*8qV7ij#WkQ3Cktp>i~a*Q&ruJx>=X#Nl}DcI0Du?Npvd zLQJofSZ;p#S$HAj2g<(U2g`mK1alYnL&N7;6eLp0_WdX6L|ij(SeH_0xb$lKfG;&>++KOY#mc1C-9 zqaO}T;BY&@8(Ru6aAOl#Guqe}gf@;NkB{uEA=cQA&BNN7G~QNog-BylN0mThyVL+@ zY)3{ky%v1UGEgDf`n9~-dPRNDfxMgtdk~V8 zScFJ4(F{=`ia5}lIjEclL~IpXXcbY7uLVJDwLl0tTgwo2PGcJeJ#05c;4J6DID{x= z)*(_&WF8eFheOrP*gm3~UkhqDRLzVnM5tyO6ETQkt1-M2G2EVu1(lMe#7I=KiL9hT zz;K54W@{#q3aAAxoS~fA8j4a5@AZ(m(B71NqeRQTc$W4DEs<&V2F=%ig{`<6AzqFY zaR{&86)ZI`CS$Y)r|VA$6>GyJ$lmQ|Z*L*%wpd39)8TQ{H9f$~Dw`Kj3g6YkWl7kW zXF`>^NsqlQx^Hey;9aI2*#j!He(dP3#gE|lsnvO~aOM^c{#V(5+l_@Y>+9s8?JS~F zx*)KDI~xOw!0*h%5h zJ-D$5I55JyM3+1`e2U9Wac)j+TybDjQl=1_W%ZIAXqJ`2Dbl!D6jG35Mb)RCByAi_ z-lJQ9M_Y$4;b&y9jdRuE%FZzP;%@U#ckbi9&r3-C{o!alNG?G;NeT99<00^i#*0?$cA7tjUT6 zY9nn?8QPw%ust#AU;?CX!9AQwGr+oz7;kkb>2(l1PRf*wD zZ#44ycl1K*nALu%0X*u4a&35{yV`DF38}TIKu2{L9Ywwum`+Q08HJ9Lf$XbKLwr;q zU_ROjqVna?Mx=Iv$Tv#@A%ro~4Wv;r48%L7z*M=`qwM5EFic661Z5IfD+tW2ol^NJ z30xHf(xuTIh}E%0;y{WZxL7=b$h;~6Ad>3<8ie?W!b1Y3Ypw@Aem3A3+&zl~ct!(( zg3=%mddAz*&n}{dZoL)PfvO8*+g%S)(q7HW{H4mgrZe}v%y_RkHE(Xp-0uCiIyK4t z4}$~(eol6by{3;7^Sc4RetXg8I>9r^0Ts#fgJ%-u!*EO*-y5EZ;bV@HZ^I;I+=;^A zSec_Xu92B{tR(Qo${xAHM+NW)eMSk9dmt!6&H-T=YH}#k0=(trAYV+AH1Nd=GQ)Qj zxEHmQF{O$*P0kfq^VnZ(yTh%$L)@iH)1rne^7xbEu+EY@ALn8vaz89Wl#59Uy0Dm5 z{Vd`Y`k@-QVwFJM%}<9J-V0)VP}u9;gI&0O<9Pnt`gr9)cGou$3HWa-LDolIPzVO} zVe&faLh{Yw2ei(ClWE*sPDAp&kHk`@L+hMY=Q=#l0*?F{{_fJ>2x{YJN8Dh}cST>P z!Jj8FS_4rryh0Mi;8O8V_P|9Y^00PlUuLoTDtR%r=iK4z&% z|4q@??Bv(Ne~2TDcITrdx|q9rrhy-Qqx==EXP)&au1(7RWQkOb_d{2~^NY~4aO1)f z@XlDazK<-e&euo)j5yZ2blY~CHr{W1fV<)`+bv(&LN{nNaBnx(I+!8lh3~`0hkO_O zf5P=}<0JaB^OCZ5IXV7Vr6ZTMJB=m2TK>PJ1gV~wQ%uZAAi4w>j~S_r^}^0pUcWGx zbLU?SPeZiZHAJpFKnum%cf(@^&QL0#-9}pi0?GyC5B;J9fG(X|<+(!|#8uI)@-%Cj ze$qb}i)xS5rAe4%H}{@+sz!jyxJC&ov&L6SU{y@!hk+$rmSb(Hmea<$O^-TWtLW1B zmP{g+V0o9u)9O_)An>cO@Ejnn)%ct`lS<<(=E>)_yt~8s2GLWASl61lh}z5Vmj@bk z=lkA(Kl=A$@qYyU>*K?1oKQvH&F>VvvisTEm1OtRG=SN;RT-q66J9geE<+aD#E-<= zdAY?NtbIwgmmtqlon#)cqC()EQ%#lFJFj5q!5yc(_&7Dx0>aCX^f*odoN9QyazZ9W z<9V4yKQw?mH<~tLFiO;e$qPlvIx`DXWvzIeRG!sT2+nh=sSuy%mdk^*XB (D44+$W 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%0A3YLV>f{Zv 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�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 RET +;; Note: it will refuse to run unless byte-compiled +;; - add these lines to your .emacs file: +;; (autoload 'js2-mode "js2" nil t) +;; (add-to-list 'auto-mode-alist '("\\.js$" . js2-mode)) +;; +;; To customize how it works: +;; M-x customize-group RET js2-mode RET +;; +;; The variable `js2-mode-version' is a date stamp. When you upgrade +;; to a newer version, you must byte-compile the file again. +;; +;; Notes: +;; +;; This mode is different in many ways from standard Emacs language editing +;; modes, inasmuch as it attempts to be more like an IDE. If this drives +;; you crazy, it IS possible to customize it to be more like other Emacs +;; editing modes. Please customize the group `js2-mode' to see all of the +;; configuration options. +;; +;; Some of the functionality does not work in Emacs 21 -- upgrading to +;; Emacs 22 or higher will get you better results. If you byte-compiled +;; js2.el with Emacs 21, you should re-compile it for Emacs 22. +;; +;; Unlike cc-engine based language modes, js2-mode's line-indentation is not +;; customizable. It is a surprising amount of work to support customizable +;; indentation. The current compromise is that the tab key lets you cycle among +;; various likely indentation points, similar to the behavior of python-mode. +;; +;; This mode does not yet work with "multi-mode" modes such as mmm-mode +;; and mumamo, although it could possibly be made to do so with some effort. +;; This means that js2-mode is currently only useful for editing JavaScript +;; files, and not for editing JavaScript within